gpt4 book ai didi

android - 如何获取拍摄照片的uri?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:59:21 24 4
gpt4 key购买 nike

我想达到什么目的?我想获取捕获图像的 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();
}

所以一切正常。但仅限于某些设备。我想它只适用于 API 级别超过 21 台设备。在其他设备中,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();
}

以上概念需要在 list 上添加一些标签:

 <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 为 null。

那么,为了实现我的目标,我需要做什么?

最佳答案

按照以下步骤操作。

第 1 步:在 res/xml 文件夹中创建 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>

第 2 步:在 list 中声明提供商,如下所示。

       <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>

如果您在以下位置遇到错误:android:name="android.support.v4.content.FileProvider"使用:

<provider
android:name="androidx.core.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>

第 3 步:如下所示编写您的相机 Intent 。

    Intent m_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), "MyPhoto.jpg");
Uri uri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);
m_intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(m_intent, REQUEST_CAMERA_IMAGE);

第 4 步:在 onActivityResult 中处理相机结果,如下所示。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {

//TODO... onCamera Picker Result
case REQUEST_CAMERA_IMAGE:
if (resultCode == RESULT_OK) {

//File object of camera image
File file = new File(Environment.getExternalStorageDirectory(), "MyPhoto.jpg");

//Uri of camera image
Uri uri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);

}
break;
}
}

关于android - 如何获取拍摄照片的uri?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47448297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com