【发布时间】:2017-11-23 05:39:03
【问题描述】:
我想实现什么? 我想获取捕获图像的 URI 并将其保存在 Firebase 上。 我尝试了什么? 首先我需要打开相机。下面我是如何做到的:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null)
startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
捕获图像后,我需要获取图像的 URI。下面我是如何做到的:
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CAMERA_REQUEST_CODE) {
if (data != null) {
if (data.getData() != null) {
Uri capturedImageUri = data.getData();
} else {
Toast.makeText(getContext(), getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getContext(), getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
所以一切都很好。但仅在某些设备上。我想它只适用于超过 21 个设备的 API 级别。在其他设备中,getData() 返回 null。
那么,接下来我做了什么? 我发现我可以通过以下代码获取图像的位图:
Bitmap bitmap = (Bitmap)data.getExtras().get("data") ;
所以,我有一张图像的位图。我需要获取这张图片的 URI。下面我是如何做到的:
public Uri getImageUri(Context inContext, Bitmap inImage) {
String path =
Images.Media.insertImage(inContext.getContentResolver(), inImage,
"Title", null);
return Uri.parse(path);
}
上面的代码返回了 URI,但是图片质量很差。
所以,我一直在寻找解决方案。并发现正确的方法是在我启动CameraActivity时创建文件并保存该文件的uri。而onActivityResult 我试图得到那个uri。下面我是如何做到的:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
}
if (photoFile != null) {
Uri photoUri = FileProvider.getUriForFile(getContext(), "i_dont_know_what_to_write_here", photoFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
}
}
我的onActivityResult变成了:
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CAMERA_REQUEST_CODE) {
if (data != null) {
Uri capturedPhotoUri =
data.getParcelableExtra(MediaStore.EXTRA_OUTPUT);
} else {
Toast.makeText(getContext(),
getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
上述概念需要在清单上添加一些标签:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="i_dont_know_what_to_write_here"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
我的 xml 文件是:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="images"/>
</paths>
上述方法无效,因为onActivityReuslt 上的data 为空。
那么,我需要做什么才能实现我的目标?
【问题讨论】:
-
@akhilesh0707 谢谢,但那里的答案是关于如何从 uri 获取文件路径。我的问题是获取uri。我该如何使用它?
-
So, I have a bitmap of the image. And I needed to get the URI of this image.。是的,你有一个位图。你只有一个位图。位图没有 uri。所以不要要求该位图/图像的 uri。但是,您可以做的是将该位图保存到文件中,然后从文件中获取 uri。或者将位图保存到媒体存储中,然后从存储中获取 uri。但是位图仍然没有 uri。
标签: android android-camera uri android-fileprovider