Android Cameraアプリ初探一
5885 ワード
Androidカメラアプリには、システムカメラを呼び出すアプリと、自分でカメラを作るアプリの2種類があります.
まずシステムのカメラを呼び出すには、携帯電話に写真を撮るハードウェアがあることを確認する必要があります.
判断を表示:
暗黙的な判断:(条件に合わない場合、携帯電話はインストールに成功しません.デフォルトではrequiredはtrueです.falseに設定するとインストールできます.この場合、システムを呼び出して写真を撮る場合は表示判断を行います)
ここで注意すべき点は、写真を撮るハードウェアがあるかどうかを判断するコードがあり、ここでもカメラが使えるかどうかを判断するコードがあるはずです.
システム撮影モード1(サムネイル返却)
クリックイベント:
コールバック方法:
システム写真モード2(写真を返却)
クリックイベント:
適切な方法:
写真を撮ってからコールバック:
以上の実装は、ファイルを書く操作に関連しているため、権限を加える必要があります.
書き込み権限は読み取りも許可されます.読み取りと書き込みがある場合は、この権限を追加するだけです.
OOMが表示されないように、通常、画像がスケールされた後にコードが表示されます.
まずシステムのカメラを呼び出すには、携帯電話に写真を撮るハードウェアがあることを確認する必要があります.
判断を表示:
/** 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);
}