gpt4 book ai didi

android - 捕获的图像未存储在 android 11 中

转载 作者:行者123 更新时间:2023-12-04 14:53:30 25 4
gpt4 key购买 nike

我无法将捕获的图像存储在 (getExternalFilesDir(Environment.DIRECTORY_PICTURES)) Android 11 设备中。
我已经添加了<uses-permissionandroid:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>在 list 和所有文件访问中。但它不起作用。

if (Build.VERSION.SDK_INT >= 30) {
if (!Environment.isExternalStorageManager()) {
try {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse(String.format("package:%s", applicationContext.packageName))
startActivityForResult(intent, 2296)
} catch (e: Exception) {
val intent = Intent()
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
startActivityForResult(intent, 2296)
}
}
}
此代码在 Android 11 设备下运行。但在 Android 11 上,文件未创建 File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) .toString() + "/" + FolderName )

最佳答案

您手机的摄像头没有在指定位置写入的权限。因此,要解决此问题,您需要使用文件提供程序并为其授予适当的权限,以便相机可以将图像写入您的文件。
要做到这一点,

  • 创建一个文件提供者。在您的 list 文件中,添加:

  •         <provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" /> // <-------- see this
    </provider>
    现在创建一个 files.xml文件在您的 res/xml文件夹。在其中,编写一些代码:
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
    <cache-path
    name="camera"
    path="Camera/" />
    <cache-path
    name="cache"
    path="/" />
    <files-path
    name="files"
    path="." />
    <external-path
    name="external"
    path="." />
    <external-files-path
    name="my_images"
    path="/"/>
    // todo: add necessary folders according to your requirements...
    // also, this is an old example. Consider googling for the latest style. I'm just copying from an old project I have, and it kinda works...
    </paths>
    所以在这里我们为 FileProvider 提供了可以与外部应用程序共享的文件夹。
    2. 现在创建一个您要存储照片的 uri。在您的 Activity 中:
    Context applicationContext = getApplicationContext();
    File root = getCachedDir(); // consider using getExternalFilesDir(Environment.DIRECTORY_PICTURES); you need to check the file_paths.xml
    File capturedPhoto = new File(root, "some_photo.jpeg");
    if(!photoFile.exists()) {
    photoFile.mkdirs();
    }
    Uri photoURI = FileProvider.getUriForFile(applicationContext, applicationContext.getPackageName() + ".fileprovider", capturedPhoto);
    请注意我的项目需要临时保存图片,所以我使用了cachedDir。如果您永久保存照片,请使用 getExternalFilesDir(Environment.DIRECTORY_PICTURES);并正确修改 file_paths.xml。
  • 现在我们有了正确的 uri,我们可以调用相机 Intent :

  • Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
    startActivityForResult(takePictureIntent, REQUEST_CODE);
  • 最后,在 Activity 结果中,做一些事情:

  •     @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
    // todo: maybe show photo in an imageView
    }
    }
    我希望这行得通。
    编辑
    如果您在生产中使用此应用程序,则依赖 android 的默认相机应用程序是一个坏主意。我们的应用程序以前使用过这种方式,它可以与三星的默认相机配合使用。但是我们的很多用户都使用了第三方应用,例如 PixArt ,它不会将照片保存到我们给定的位置。所以我们必须使用 CameraX 实现一个内置摄像头。 .所以考虑使用 CameraX 或其他相机库。

    关于android - 捕获的图像未存储在 android 11 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68600921/

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