<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                【**補充:我已在對此代碼進行了全面的升級,升級后代碼結構更加利于維護擴展,全面適配所有手機,參見[博文](http://blog.csdn.net/yanzi1225627/article/details/33028041)。此文中的資源也不要再下載了,請下載升級后的[代碼](http://download.csdn.net/detail/yanzi1225627/7540873),如有問題請留言反饋,謝謝。---------------------------2014-6-23**】 ?**?** ** ** 【后注:】下載代碼的注意,我的手機是4.3寸的屏,華為U9200.如果不能運行的請修改參數。看本篇的第四條。 ?? 除夕之夜,程序員還在編代碼。[http://blog.csdn.net/yanzi1225627/article/details/7926994](http://blog.csdn.net/yanzi1225627/article/details/7926994)這是我幾個月前寫的代碼,現在看來真是垃圾不堪阿。變量名字不規范,整個架構拉雜,幾乎沒有注釋,程序不穩鍵,沒有安全退出,導致攝像頭下次不可用。 ??? 這個代碼幾乎涉及到了攝像頭開發的所有方面,(除了PreviewCallback,這塊東西我會結合android攝像頭自動識別人臉/火災來談),且力求精簡,是雜家的心血阿!相對之前改進之處有: **1,精簡。**只有一個ImageButton用來實現按下拍照。拍照后自動保存,進入預覽界面。 不像原來的要三個按鍵:預覽/拍照/保存。 **2,聚焦方面實現不間斷循環聚焦**。 不像之前的,要按一下按鍵聚焦一次。 **3,ImageButton增加了按下的效果。**按之前示例如下:![](https://box.kancloud.cn/2016-02-18_56c5455eaeed9.png) ,點擊后背景變暗,有種風車旋轉的感覺。 **4,增加了查詢攝像頭PictureSizes和PreviewSize的代碼**,調試程序時應先查詢出自己的參數然后配置。不同的手機參數不同。另外,預覽surfaceView的高我設為800px,如果手機屏幕太小,這個參數要改。 5,改進了之前的按back返回按鍵退出程序后,再次進入程序camera沒有釋放,致使程序掛掉的問題。 6,改進了預覽時手機橫豎屏切換時,程序掛掉的毛病。但這里的布局還是采用默認的豎屏。 7,在實現循環聚焦的同時,保留了autoFocus()接口。可以測試出,在使用**FOCUS_MODE_CONTINUOUS_VIDEO**聚焦模式下,autoFocus不發揮作用。**如果不支持不間斷聚焦,setFocusMode就改成**[**FOCUS_MODE_AUTO**](http://developer.android.com/reference/android/hardware/Camera.Parameters.html#FOCUS_MODE_AUTO)**!!!** 8,注釋更加良好。 廢話不說了請看源碼: **第一部分:Manifinest.xml** ~~~ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="yan.guoqi.rectphoto" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <!-- 增加文件存儲和訪問攝像頭的權限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".RectPhoto" android:label="@string/title_activity_rect_photo" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ~~~ **第二部分:布局文件** ~~~ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/BestWish" tools:context=".RectPhoto" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <SurfaceView android:id="@+id/previewSV" android:layout_width="fill_parent" android:layout_height="800px" /> </FrameLayout> <ImageButton android:id="@+id/photoImgBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/photo_img_btn" android:layout_gravity="center" /> </LinearLayout> ~~~ **第三部分:RectPhoto.java主程序** ~~~ package yan.guoqi.rectphoto; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.ShutterCallback; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.widget.ImageButton; public class RectPhoto extends Activity implements SurfaceHolder.Callback{ private static final String tag="yan"; private boolean isPreview = false; private SurfaceView mPreviewSV = null; //預覽SurfaceView private SurfaceHolder mySurfaceHolder = null; private ImageButton mPhotoImgBtn = null; private Camera myCamera = null; private Bitmap mBitmap = null; private AutoFocusCallback myAutoFocusCallback = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //設置全屏無標題 requestWindowFeature(Window.FEATURE_NO_TITLE); int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; Window myWindow = this.getWindow(); myWindow.setFlags(flag, flag); setContentView(R.layout.activity_rect_photo); //初始化SurfaceView mPreviewSV = (SurfaceView)findViewById(R.id.previewSV); mySurfaceHolder = mPreviewSV.getHolder(); mySurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);//translucent半透明 transparent透明 mySurfaceHolder.addCallback(this); mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //自動聚焦變量回調 myAutoFocusCallback = new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { // TODO Auto-generated method stub if(success)//success表示對焦成功 { Log.i(tag, "myAutoFocusCallback: success..."); //myCamera.setOneShotPreviewCallback(null); } else { //未對焦成功 Log.i(tag, "myAutoFocusCallback: 失敗了..."); } } }; mPhotoImgBtn = (ImageButton)findViewById(R.id.photoImgBtn); //手動設置拍照ImageButton的大小為120×120,原圖片大小是64×64 LayoutParams lp = mPhotoImgBtn.getLayoutParams(); lp.width = 120; lp.height = 120; mPhotoImgBtn.setLayoutParams(lp); mPhotoImgBtn.setOnClickListener(new PhotoOnClickListener()); mPhotoImgBtn.setOnTouchListener(new MyOnTouchListener()); } /*下面三個是SurfaceHolder.Callback創建的回調函數*/ public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) // 當SurfaceView/預覽界面的格式和大小發生改變時,該方法被調用 { // TODO Auto-generated method stub Log.i(tag, "SurfaceHolder.Callback:surfaceChanged!"); initCamera(); } public void surfaceCreated(SurfaceHolder holder) // SurfaceView啟動時/初次實例化,預覽界面被創建時,該方法被調用。 { // TODO Auto-generated method stub myCamera = Camera.open(); try { myCamera.setPreviewDisplay(mySurfaceHolder); Log.i(tag, "SurfaceHolder.Callback: surfaceCreated!"); } catch (IOException e) { // TODO Auto-generated catch block if(null != myCamera){ myCamera.release(); myCamera = null; } e.printStackTrace(); } } public void surfaceDestroyed(SurfaceHolder holder) //銷毀時被調用 { // TODO Auto-generated method stub Log.i(tag, "SurfaceHolder.Callback:Surface Destroyed"); if(null != myCamera) { myCamera.setPreviewCallback(null); /*在啟動PreviewCallback時這個必須在前不然退出出錯。 這里實際上注釋掉也沒關系*/ myCamera.stopPreview(); isPreview = false; myCamera.release(); myCamera = null; } } //初始化相機 public void initCamera(){ if(isPreview){ myCamera.stopPreview(); } if(null != myCamera){ Camera.Parameters myParam = myCamera.getParameters(); // //查詢屏幕的寬和高 // WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE); // Display display = wm.getDefaultDisplay(); // Log.i(tag, "屏幕寬度:"+display.getWidth()+" 屏幕高度:"+display.getHeight()); myParam.setPictureFormat(PixelFormat.JPEG);//設置拍照后存儲的圖片格式 // //查詢camera支持的picturesize和previewsize // List<Size> pictureSizes = myParam.getSupportedPictureSizes(); // List<Size> previewSizes = myParam.getSupportedPreviewSizes(); // for(int i=0; i<pictureSizes.size(); i++){ // Size size = pictureSizes.get(i); // Log.i(tag, "initCamera:攝像頭支持的pictureSizes: width = "+size.width+"height = "+size.height); // } // for(int i=0; i<previewSizes.size(); i++){ // Size size = previewSizes.get(i); // Log.i(tag, "initCamera:攝像頭支持的previewSizes: width = "+size.width+"height = "+size.height); // // } //設置大小和方向等參數 myParam.setPictureSize(1280, 960); myParam.setPreviewSize(960, 720); //myParam.set("rotation", 90); myCamera.setDisplayOrientation(90); myParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); myCamera.setParameters(myParam); myCamera.startPreview(); myCamera.autoFocus(myAutoFocusCallback); isPreview = true; } } /*為了實現拍照的快門聲音及拍照保存照片需要下面三個回調變量*/ ShutterCallback myShutterCallback = new ShutterCallback() //快門按下的回調,在這里我們可以設置類似播放“咔嚓”聲之類的操作。默認的就是咔嚓。 { public void onShutter() { // TODO Auto-generated method stub Log.i(tag, "myShutterCallback:onShutter..."); } }; PictureCallback myRawCallback = new PictureCallback() // 拍攝的未壓縮原數據的回調,可以為null { public void onPictureTaken(byte[] data, Camera camera) { // TODO Auto-generated method stub Log.i(tag, "myRawCallback:onPictureTaken..."); } }; PictureCallback myJpegCallback = new PictureCallback() //對jpeg圖像數據的回調,最重要的一個回調 { public void onPictureTaken(byte[] data, Camera camera) { // TODO Auto-generated method stub Log.i(tag, "myJpegCallback:onPictureTaken..."); if(null != data){ mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字節數據,將其解析成位圖 myCamera.stopPreview(); isPreview = false; } //設置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation", 90)失效。圖片竟然不能旋轉了,故這里要旋轉下 Matrix matrix = new Matrix(); matrix.postRotate((float)90.0); Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false); //保存圖片到sdcard if(null != rotaBitmap) { saveJpeg(rotaBitmap); } //再次進入預覽 myCamera.startPreview(); isPreview = true; } }; //拍照按鍵的監聽 public class PhotoOnClickListener implements OnClickListener{ public void onClick(View v) { // TODO Auto-generated method stub if(isPreview && myCamera!=null){ myCamera.takePicture(myShutterCallback, null, myJpegCallback); } } } /*給定一個Bitmap,進行保存*/ public void saveJpeg(Bitmap bm){ String savePath = "/mnt/sdcard/rectPhoto/"; File folder = new File(savePath); if(!folder.exists()) //如果文件夾不存在則創建 { folder.mkdir(); } long dataTake = System.currentTimeMillis(); String jpegName = savePath + dataTake +".jpg"; Log.i(tag, "saveJpeg:jpegName--" + jpegName); //File jpegFile = new File(jpegName); try { FileOutputStream fout = new FileOutputStream(jpegName); BufferedOutputStream bos = new BufferedOutputStream(fout); // //如果需要改變大小(默認的是寬960×高1280),如改成寬600×高800 // Bitmap newBM = bm.createScaledBitmap(bm, 600, 800, false); bm.compress(Bitmap.CompressFormat.JPEG, 100, bos); bos.flush(); bos.close(); Log.i(tag, "saveJpeg:存儲完畢!"); } catch (IOException e) { // TODO Auto-generated catch block Log.i(tag, "saveJpeg:存儲失敗!"); e.printStackTrace(); } } /*為了使圖片按鈕按下和彈起狀態不同,采用過濾顏色的方法.按下的時候讓圖片顏色變淡*/ public class MyOnTouchListener implements OnTouchListener{ public final float[] BT_SELECTED=new float[] { 2, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 1, 0 }; public final float[] BT_NOT_SELECTED=new float[] { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }; public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if(event.getAction() == MotionEvent.ACTION_DOWN){ v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED)); v.setBackgroundDrawable(v.getBackground()); } else if(event.getAction() == MotionEvent.ACTION_UP){ v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED)); v.setBackgroundDrawable(v.getBackground()); } return false; } } @Override public void onBackPressed() //無意中按返回鍵時要釋放內存 { // TODO Auto-generated method stub super.onBackPressed(); RectPhoto.this.finish(); } } ~~~ 源碼下載鏈接: [http://download.csdn.net/detail/yanzi1225627/5060323](http://download.csdn.net/detail/yanzi1225627/5060323) 歡迎android愛好者加群248217350,備注:yanzi **注:代碼不能正常運行的請看上面第4條,修改相關參數。 **----------------------------------------------------------------------------------------本文系原創,轉載請注明作者:yanzi1225627
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看