Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检索照片时相机崩溃_Java_Android - Fatal编程技术网

Java 检索照片时相机崩溃

Java 检索照片时相机崩溃,java,android,Java,Android,我在尝试从相机检索照片时遇到问题 我试图允许用户使用相机应用程序拍照,然后在应用程序中显示预览 我还需要在应用程序的稍后阶段访问该文件(但这不是问题) 我遇到了以下崩溃: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{41f55850 10769:com.sec.android.app.camera/u0a84} (pid=10769, uid=1008

我在尝试从相机检索照片时遇到问题

我试图允许用户使用相机应用程序拍照,然后在应用程序中显示预览

我还需要在应用程序的稍后阶段访问该文件(但这不是问题)

我遇到了以下崩溃:

Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{41f55850 10769:com.sec.android.app.camera/u0a84} (pid=10769, uid=10084) that is not exported from uid 10119
我已经跟踪和其他一些人。我的Galaxy S8+等设备没有问题。仅此设备运行Android 4.4.4 API 19

Android清单:

    <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/file_paths" />
    </provider>
单击按钮时启动相机意图:

if (isCameraApplicationAvailable(PhotoActivity.this)) {
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);


                File f = null;
                try {
                    f = setUpPhotoFile();
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(PhotoActivity.this, BuildConfig.APPLICATION_ID + ".provider", f));
                } catch (IOException e) {
                   // Handle exception
                }
                List<ResolveInfo> resolvedIntentActivities = getPackageManager().queryIntentActivities(takePictureIntent, PackageManager.MATCH_DEFAULT_ONLY);
                for (ResolveInfo resolvedIntentInfo : resolvedIntentActivities) {
                    String packageName = resolvedIntentInfo.activityInfo.packageName;

                    grantUriPermission(packageName, Uri.fromFile(f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                }
                takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                startActivityForResult(takePictureIntent, ACTION_TAKE_PHOTO);
            }
我不明白为什么它只是4.4.4上的一个问题,而不是其他操作系统的问题


当出现崩溃时,并不是说我的应用程序崩溃了,而是说摄像头已经停止工作,我只能在没有过滤器的情况下查看日志时查看崩溃,这意味着崩溃不在我的应用程序中?

您正面临此问题,因为您尚未在google上的应用程序搜索中指定运行时权限,以便在执行此操作后以编程方式指定运行时权限。您的问题应该得到解决

您正面临此问题,因为您尚未在google上的应用程序搜索中指定运行时权限,以便在执行此操作后以编程方式指定运行时权限。您的问题应该得到解决

出于使用文件提供程序的安全原因,您必须在意图中使用标志。所以使用
addFlags(Intent.FLAG\u GRANT\u READ\u URI\u PERMISSION);或addFlags(Intent.FLAG\u GRANT\u WRITE\u URI\u PERMISSION)在您的
图片内容中


这对于Android中的文件提供程序是必要的,出于安全原因,使用文件提供程序时,您必须在意图中使用该标志。所以使用
addFlags(Intent.FLAG\u GRANT\u READ\u URI\u PERMISSION);或addFlags(Intent.FLAG\u GRANT\u WRITE\u URI\u PERMISSION)在您的
图片内容中


这对于Android中的文件提供商来说是必要的,我想一个简单的检查就能解决你的问题

      if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
       grantUriPermission(packageName, Uri.fromFile(f), 
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

    takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }

if(Build.VERSION.SDK_INT我认为一个简单的检查就能解决您的问题

      if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
       grantUriPermission(packageName, Uri.fromFile(f), 
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

    takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }

if(Build.VERSION.SDK_INT根据@MikeM的评论,我使用了
Uri.fromFile(file)
而不是使用
FileProvider
来获取Uri

他这样做:

grantUriPermission(packageName, Uri.fromFile(f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
grantUriPermission(packageName, FileProvider.getUriForFile(PhotoActivity.this, BuildConfig.APPLICATION_ID + ".provider", f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
当我应该这样做的时候:

grantUriPermission(packageName, Uri.fromFile(f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
grantUriPermission(packageName, FileProvider.getUriForFile(PhotoActivity.this, BuildConfig.APPLICATION_ID + ".provider", f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
这解决了我的问题


谢谢@MikeM

根据@MikeM的评论,我使用了
Uri.fromFile(file)
而不是使用
FileProvider
来获取Uri

他这样做:

grantUriPermission(packageName, Uri.fromFile(f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
grantUriPermission(packageName, FileProvider.getUriForFile(PhotoActivity.this, BuildConfig.APPLICATION_ID + ".provider", f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
当我应该这样做的时候:

grantUriPermission(packageName, Uri.fromFile(f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
grantUriPermission(packageName, FileProvider.getUriForFile(PhotoActivity.this, BuildConfig.APPLICATION_ID + ".provider", f), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
这解决了我的问题


谢谢@MikeM

权限拒绝,请在清单中添加外部读取权限检查此问题:抱歉,该权限在清单中可能重复,以及权限拒绝可能重复,请在清单中添加外部读取权限检查此问题:抱歉,该权限在mani中可能重复fest以及可能的副本