这几乎可以在所有设备上正常工作,但是一旦捕获图像并且用户按保存,就会重新打开相机。
启动相机:
private void launchCamera() {
try
{
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = getFilePath(2);
imageUri = Uri.fromFile(file);
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(cameraIntent, 1);
}catch(Exception e){
Log.v("Exception ", e.toString());
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
try {
if (resultCode == RESULT_OK){
switch (requestCode) {
case 1:
try{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
imgView.setImageBitmap(bitmap);
break;
}catch (Exception e) {
Log.v("Exception ", e.toString());
}
default:
break;
}
}
}
catch(Exception e){
Log.v("Exception ", e.toString());
}
}
创建临时文件路径:
private File getFilePath(int type) {
File mediaFile = null;
try{
File mediaStorageDir = null;
Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(isSDPresent) {
String path = Environment.getExternalStorageDirectory()+"/MyFolder";
mediaStorageDir = new File(path);
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.v("Exception ", "failed to create directory");
return mediaFile;
}
}
} else {
mediaStorageDir = appContext.getDir("MyFolder", Context.MODE_PRIVATE);
}
if (type == 2){
mediaFile = new File(mediaStorageDir.getPath() + File.separator + "MyFolder_IMG_"+ String.valueOf(UUID.randomUUID()) + ".png");
}
} catch(Exception e){
Log.v("Exception ", e.toString());
}
return mediaFile;
}
这几乎可以在所有设备上正常工作
充其量,它对于您尝试过的设备以及您在这些设备上尝试过的相机应用程序"工作正常"。有超过10,000种Android设备型号,Play商店中有数百个相机应用程序。这导致了数百万种组合。
理想情况下,MediaStore.ACTION_IMAGE_CAPTURE
启动的活动将在用户拍照后通过setResult()
和finish()
将控制权返回给你的应用。但是,没有任何要求(通过任何类型的审批流程验证)强制相机应用的开发人员在用户拍照后将控制权归还给你。
你的选择是接受目前的行为,建议用户在需要时按 BACK 返回你的应用,或者跳过MediaStore.ACTION_IMAGE_CAPTURE
并实现你自己的逻辑来使用相机拍照。