Android Cameraアプリ初探一

5885 ワード

Androidカメラアプリには、システムカメラを呼び出すアプリと、自分でカメラを作るアプリの2種類があります.
まずシステムのカメラを呼び出すには、携帯電話に写真を撮るハードウェアがあることを確認する必要があります.
判断を表示:
/** Check if this device has a camera */ 
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera 
        return true; 
    } else { 
        // no camera on this device 
        return false; 
    } 
} 

暗黙的な判断:(条件に合わない場合、携帯電話はインストールに成功しません.デフォルトではrequiredはtrueです.falseに設定するとインストールできます.この場合、システムを呼び出して写真を撮る場合は表示判断を行います)
<manifest ... >
    <uses-feature android:name="android.hardware.camera"
                  android:required="true" />
    ...
</manifest>

ここで注意すべき点は、写真を撮るハードウェアがあるかどうかを判断するコードがあり、ここでもカメラが使えるかどうかを判断するコードがあるはずです.
if(intent.resolveActivity(getPackageManager()) != null){
    //      
}else{
    //       
}

システム撮影モード1(サムネイル返却)
クリックイベント:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
/**
 * MediaStore.ACTION_IMAGE_CAPTURE  android.media.action.IMAGE_CAPTURE   
 *  start           Action android.media.action.IMAGE_CAPTURE   
 *     AndroidManifest.xml   Activity  
 * <intent-fileter>
 *     <action android:name="android.media.action.IMAGE_CAPTURE"/>
 *     <category android:name="android.intent.category.DEFAULT"/>
 * </intent-fileter>
 *               ,                  
 */
if(takePictureIntent.resolveActivity(getPackageManager()) != null){//        
    //      
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}else {
    Toast.makeText(CameraActivity.this, "     ", Toast.LENGTH_SHORT).show();
}

コールバック方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == Activity.RESULT_OK && requestCode == REQUEST_IMAGE_CAPTURE){
        //    ,                
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        img_iv.setImageBitmap(imageBitmap);
    }
}

システム写真モード2(写真を返却)
クリックイベント:
take_picture.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        image = createImageFile2();
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            //              
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        } else {
            Toast.makeText(CameraActivity2.this, "     ", Toast.LENGTH_SHORT).show();
        }

    }
});

適切な方法:
/**
 *      File
 * @return
 */
private File createImageFile1(){
    File file = new File(Environment.getExternalStorageDirectory(),"test.jpg");
    return file;
}

/**
 *      File
 * @return
 * @throws IOException
 */
private File createImageFile2() {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);// sd    pictures  ,         app       
    /**
     *              getExternalFilesDir(). Android 4.3 and lower     app  
     *   Android 4.4           
     *   getExternalFilesDir()            
     *      :
     * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     *  android:maxSdkVersion="18" />
     */
    File file = null;
    try {
        file = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );
    } catch (IOException e) {
        e.printStackTrace();
    }
    return file;
}

写真を撮ってからコールバック:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK && requestCode == REQUEST_TAKE_PHOTO){
        iv.setImageURI(Uri.fromFile(image));
    }
}

以上の実装は、ファイルを書く操作に関連しているため、権限を加える必要があります.
<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

書き込み権限は読み取りも許可されます.読み取りと書き込みがある場合は、この権限を追加するだけです.
OOMが表示されないように、通常、画像がスケールされた後にコードが表示されます.
/**
 *        
 */
private void pic(){
    //       
    int targetW = iv.getWidth();
    int targetH = iv.getHeight();

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;//    BitmapFactory           ,           
    //    false       
    BitmapFactory.decodeFile(image.getAbsolutePath(),options);
    int photoW = options.outWidth;
    int photoH = options.outHeight;

    int scaleFactor = Math.max(photoW / targetW, photoH / targetH);//        ,                  
    //  
    options.inJustDecodeBounds = false;//       
    options.inSampleSize = scaleFactor;//  , inSampleSize = 8 ,              1/8
    options.inPurgeable = true;// inPurgeable   true   ,                Bitmap       ,  
    //  OOM  ,  false        

    Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(),options);
    iv.setImageBitmap(bitmap);
}