国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android自定義Camera拍照并查看圖片

2019-10-22 18:33:11
字體:
來源:轉載
供稿:網友

本文實例為大家分享了android自定義Camera拍照并查看圖片的具體代碼,供大家參考,具體內容如下

1、打開相機

a.預覽拍攝圖片,需用到SurfaceView,并且實現其回調函數implements SurfaceHolder.Callback;
activity_camera.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical" >  <SurfaceView    android:id="@+id/sv"    android:layout_width="match_parent"    android:layout_height="0dp"    android:layout_weight="1" />  <Button    android:id="@+id/btn_camera"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="拍照" /></LinearLayout>

2、獲取相機并開啟預覽

/**   * 獲取系統相機   *    * @return   */  private Camera getcCamera() {    Camera camera = null;    try {      camera = Camera.open();    } catch (Exception e) {      camera = null;    }    return camera;  }
/**   * 顯示相機預覽圖片   *    * @return   */  private void showCameraView(Camera camera,SurfaceHolder holder)  {    try {      camera.setPreviewDisplay(holder);      camera.setDisplayOrientation(90);      camera.startPreview();    }catch (Exception e){      e.printStackTrace();    };  }
/**** 實現界面回調處理*/  @Override  public void surfaceCreated(SurfaceHolder holder) {    showCameraView(mCamera, holder);  }  @Override  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    mCamera.stopPreview();    showCameraView(mCamera, holder);  }  @Override  public void surfaceDestroyed(SurfaceHolder holder) {    clearCamera();  }}

3、相機主頁面處理

public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{  private SurfaceView sv;  private Camera mCamera;  private SurfaceHolder holder;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_camera);    sv = (SurfaceView)findViewById(R.id.sv);    holder = sv.getHolder();    holder.addCallback(this);    findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        // 獲取當前相機參數        Camera.Parameters parameters = mCamera.getParameters();        // 設置相片格式        parameters.setPictureFormat(ImageFormat.JPEG);        // 設置預覽大小        parameters.setPreviewSize(800, 480);        // 設置對焦方式,這里設置自動對焦        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);        mCamera.autoFocus(new Camera.AutoFocusCallback() {          @Override          public void onAutoFocus(boolean success, Camera camera) {            // 判斷是否對焦成功            if (success) {              // 拍照 第三個參數為拍照回調              mCamera.takePicture(null, null, new Camera.PictureCallback() {                @Override                public void onPictureTaken(byte[] data, Camera camera) {                  // data為完整數據                  File file = new File("/sdcard/photo.png");                  // 使用流進行讀寫                  try {                    FileOutputStream fos = new FileOutputStream(file);                    try {                      fos.write(data);                      // 關閉流                      fos.close();                      // 查看圖片                      Intent intent = new Intent();                      // 傳遞路徑                      intent.putExtra("path", file.getAbsolutePath());                      setResult(0,intent);                      finish();                    } catch (IOException e) {                      // TODO Auto-generated catch block                      e.printStackTrace();                    }                  } catch (FileNotFoundException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                  }                }              });            }          }        });      }    });  }
 @Override  protected void onResume() {    super.onResume();    if (mCamera == null) {      mCamera = getCamera();      if (holder != null) {        showCameraView(mCamera, holder);      }    }  }  @Override  protected void onPause() {    // TODO Auto-generated method stub    super.onPause();    // activity暫停時我們釋放相機內存    clearCamera();  }  @Override  protected void onDestroy() {    super.onDestroy();  }  /**   * 釋放相機的內存   */  private void clearCamera() {    // 釋放hold資源    if (mCamera != null) {      // 停止預覽      mCamera.stopPreview();      mCamera.setPreviewCallback(null);      // 釋放相機資源      mCamera.release();      mCamera = null;    }  }

4、啟動activity(設置拍照完圖片路徑返回顯示圖片處理,一定要對圖片進行采樣率操作(很可能拍照的圖片太多而無法顯示,又不報任何異常))

public class MainActivity extends AppCompatActivity {  private ImageView cameraIv;  @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    if(resultCode == 0 && requestCode == 100)    {      String path = data.getStringExtra("path");      BitmapFactory.Options options = new BitmapFactory.Options();      options.inJustDecodeBounds = true;      BitmapFactory.decodeFile(path, options);      ImageSize imageSize = getImageViewSize(cameraIv);      options.inSampleSize = caculateInSampleSize(options,          imageSize.width, imageSize.height);      // 使用獲得到的InSampleSize再次解析圖片      options.inJustDecodeBounds = false;      Bitmap bitmap = BitmapFactory.decodeFile(path, options);      cameraIv.setImageBitmap(bitmap);    }    super.onActivityResult(requestCode, resultCode, data);  }  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Button openButton = (Button) findViewById(R.id.button);    cameraIv = (ImageView) findViewById(R.id.imageView);    openButton.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        Intent intent = new Intent(MainActivity.this,CameraActivity.class);        startActivityForResult(intent,100);      }    });  }   /* 根據需求的寬和高以及圖片實際的寬和高計算SampleSize   *       * @param options   * @param width   * @param height   * @return       */  public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth,                      int reqHeight)  {    int width = options.outWidth;    int height = options.outHeight;    int inSampleSize = 1;    if (width > reqWidth || height > reqHeight)    {      int widthRadio = Math.round(width * 1.0f / reqWidth);      int heightRadio = Math.round(height * 1.0f / reqHeight);      inSampleSize = Math.max(widthRadio, heightRadio);    }    return inSampleSize;  }  public static ImageSize getImageViewSize(ImageView imageView)  {    ImageSize imageSize = new ImageSize();    DisplayMetrics displayMetrics = imageView.getContext().getResources()        .getDisplayMetrics();    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)imageView.getLayoutParams();    int width = imageView.getWidth();// 獲取imageview的實際寬度    if (width <= 0)    {      width = lp.width;// 獲取imageview在layout中聲明的寬度    }    if (width <= 0)    {      width = displayMetrics.widthPixels;    }    int height = imageView.getHeight();// 獲取imageview的實際高度    if (height <= 0)    {      height = lp.height;// 獲取imageview在layout中聲明的寬度    }    if (height <= 0)    {      height = displayMetrics.heightPixels;    }    imageSize.width = width;    imageSize.height = height;    return imageSize;  }  public static class ImageSize  {    int width;    int height;  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常山县| 攀枝花市| 富源县| 沾化县| 保康县| 西华县| 青龙| 奉化市| 贵溪市| 平原县| 大港区| 呼和浩特市| 门头沟区| 五河县| 巧家县| 全州县| 东港市| 甘肃省| 中阳县| 九龙坡区| 云和县| 扶沟县| 汕尾市| 阿拉善盟| 深圳市| 五寨县| 乌恰县| 怀安县| 衡水市| 章丘市| 桃园市| 噶尔县| 新源县| 隆昌县| 鹤山市| 赤水市| 邻水| 泰和县| 渝北区| 来凤县| 沈丘县|