Android从相机捕获图像返回空数据[重复]
Posted
技术标签:
【中文标题】Android从相机捕获图像返回空数据[重复]【英文标题】:Android Capturing an image From Camera Returns Empty Data [duplicate] 【发布时间】:2019-04-06 09:46:42 【问题描述】:在 android 应用 Intent 中捕获图像时,每次都返回 null。请参阅下面我正在使用的代码。我尝试了多种方法来获得许可和意图集,但仍然无法获取数据。
相机动作
private void takePhotoFromCamera()
if(ActivityCompat.checkSelfPermission(ObservationsView.this,
Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(getExternalCacheDir(),
String.valueOf(System.currentTimeMillis()) + ".jpg");fileUri = Uri.fromFile(file);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
cameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
else
String[] permissionRequest = Manifest.permission.CAMERA;
requestPermissions(permissionRequest, 8675309);
checkPermission();
这是响应代码
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if(resultCode == RESULT_OK )
Uri selectedImg = null;
Bitmap bmp = null;
Bundle extras;
if (requestCode == CAMERA_REQUEST)
selectedImg = data.getData();
extras = data.getExtras();
bmp = (Bitmap) extras.get("data");
else if (requestCode == CAMERA_REQUEST)
selectedImg = fileUri;
// Bitmap mphoto = (Bitmap) data.getExtras().get("data");
try
bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), fileUri);
if (bmp != null)
bmp = getBitmapFromUri(fileUri);
catch (IOException e)
e.printStackTrace();
Uri tempUri = getImageUri(getApplicationContext(), bmp);
Intent passPhoto = new Intent(this, Photo.class);
passPhoto.putExtra("image",tempUri);
passPhoto.putExtra("Caller", getIntent().getComponent().getClassName());
startActivity(passPhoto);
【问题讨论】:
你是如何从相机onActivityResult
结果中获取数据的?
您不需要返回的Intent
数据。图片位于fileUri
。你可以从那里得到它。
目标版本是什么?您是否在某些平台或任何地方都面临这个问题?
您不需要CAMERA
权限即可使用默认相机拍摄
@SalmanKhan 我正在三星 S5 和 Android 6.0 上进行测试,但我在其他设备上也遇到了同样的问题
【参考方案1】:
尝试使用以下代码在所有 API 中获取图像 -
public void takePicture()
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
file = FileProvider.getUriForFile(mContext,
BuildConfig.APPLICATION_ID + ".provider",
getOutputMediaFile());
intent.putExtra(MediaStore.EXTRA_OUTPUT, file);
startActivityForResult(intent, TAKE_IMAGE_REQUEST);
private File getOutputMediaFile()
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), getString(R.string.app_folder_name));
if (!mediaStorageDir.exists())
if (!mediaStorageDir.mkdirs())
return null;
return new File(mediaStorageDir.getPath() + File.separator +
PROFILE_PIC + getString(R.string.pic_type));
在你的 onActivityResult 上 -
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
case TAKE_IMAGE_REQUEST:
if (resultCode == RESULT_OK)
imageView.setImageURI(file);
break;
default:
break;
另外,您需要在 Manifest.xml 文件中定义提供程序 -
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="$applicationId.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
最后provider_paths.xml将如下-
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
如果您需要任何说明,请告诉我。
【讨论】:
以上是关于Android从相机捕获图像返回空数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章