Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 在Android中>;6.0第二次从gallery访问图像时获取安全权限异常_Java_Android_Runtime Permissions - Fatal编程技术网

Java 在Android中>;6.0第二次从gallery访问图像时获取安全权限异常

Java 在Android中>;6.0第二次从gallery访问图像时获取安全权限异常,java,android,runtime-permissions,Java,Android,Runtime Permissions,我是android新手,我在一个android现有项目中工作。该应用程序在android版本>6.0上崩溃,以下例外。基本上,该应用程序是从gallery中选择照片,第一次工作正常,第二次以后,该应用程序崩溃,出现权限拒绝例外 java.lang.SecurityException:权限拒绝:读取 com.google.android.apps.photos.contentprovider.MediaContentProvider uri content://com.google.android

我是android新手,我在一个android现有项目中工作。该应用程序在android版本>6.0上崩溃,以下例外。基本上,该应用程序是从gallery中选择照片,第一次工作正常,第二次以后,该应用程序崩溃,出现权限拒绝例外

java.lang.SecurityException:权限拒绝:读取 com.google.android.apps.photos.contentprovider.MediaContentProvider uri content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F1022/ORIGINAL/NONE/256350537 从pid=7789,uid=10145要求导出提供程序,或 授予许可证()

我浏览了一些链接,检查android是否引入了运行时权限,并使用下面的代码检查运行时权限

到目前为止我尝试过的事情

  • 在清单中添加了权限
  • 2.从代码中检查运行时权限

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        Log.d("Enter", "onRequestPermissionsResult: ");
    
        switch (requestCode){
            case REQUEST_CODE_PERMISSION:{
                Map<String,Integer> perms = new HashMap<>();
                //Initialize the map with the permissions
                perms.put(Manifest.permission.ACCESS_COARSE_LOCATION,PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.CAMERA,PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.READ_EXTERNAL_STORAGE,PackageManager.PERMISSION_GRANTED);
               // perms.put(Manifest.permission.READ_USER_DICTIONARY,PackageManager.PERMISSION_GRANTED);
    
                //Fill with actual results from user
                if (grantResults.length > 0){
                    for (int i = 0 ; i < permissions.length ; i++){
                        perms.put(permissions[i],grantResults[i]);
                        //check for all permissions
                        if (perms.get(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
                                && perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
                                && perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
    
                            Log.d("Permission Granted", "onRequestPermissionsResult: ");
    
                        }else{
                            Log.d("Some", "onRequestPermissionsResult: ");
                            //if (perms.get(Manifest.permission.ACCESS_COARSE_LOCATION))
                            if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)
                                    || ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_COARSE_LOCATION)
                                    || ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)){
    
                                new DialogInterface.OnClickListener(){
                                    @Override
                                    public void onClick (DialogInterface dialog, int which){
                                        switch (which){
                                            case DialogInterface.BUTTON_POSITIVE:
                                                checkAndRequestPermission();
                                                break;
                                            case DialogInterface.BUTTON_NEGATIVE:
                                                break;
                                        }
                                    }
                                };
    
                            }else{
                                Toast.makeText(this,"Go to Settings and enable Permissions",Toast.LENGTH_LONG).show();
                            }
    
                        }
    
                    }
                }
            }
        }
    }
    
    private  void showDialogOK(String message, DialogInterface.OnClickListener okListener){
        new AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton("OK",okListener)
                .setNegativeButton("Cancel",okListener)
                .create()
                .show();
    }
    
    以下是我的清单中使用的权限:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_USER_DICTIONARY"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
    <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>
    <!--  <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <!-- The following two permissions are not required to use
         Google Maps Android API v2, but are recommended. -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    
    <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-feature android:name="android.hardware.location" android:required="true" />
    <uses-feature android:name="android.hardware.location.gps" android:required="false" />
    


    记下您在安卓M下方清单中的所有权限。安卓M不需要任何额外权限。我们只需在运行时请求即可

    像这样请求你的许可。更改您的权限(仅危险权限),因为它们在清单中。把这个放在onCreate中

    ///  granting permission  ////
        if(!checkPermission())
        {
            requestPermission();
        }
     /////////////////////////////
    
    在课堂上加上这些

        ///////////////////////   permission for marshmallow  ///////////////////
    
    private boolean checkPermission(){
        int result1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
        int result2 = ContextCompat.checkSelfPermission(this, Manifest.permission.MODIFY_PHONE_STATE);
        int result3 = ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_OUTGOING_CALLS);
        int result4 = ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_INCOMING_CALLS);
        int result5   = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);
    
        if (result1 == PackageManager.PERMISSION_GRANTED && result2 == PackageManager.PERMISSION_GRANTED &&
                result3 == PackageManager.PERMISSION_GRANTED && result4 == PackageManager.PERMISSION_GRANTED
                && result5 == PackageManager.PERMISSION_GRANTED){
    
            return true;
    
        } else {
    
            //Toast.makeText(this,"You don't have permission to use further features",Toast.LENGTH_LONG).show();
            return false;
    
        }
    }
    
    private void requestPermission(){
    
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE) &&
                ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.MODIFY_PHONE_STATE) &&
                ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.PROCESS_OUTGOING_CALLS)  &&
                ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.PROCESS_INCOMING_CALLS) &&
                        ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)){
    
            Toast.makeText(this,"Application needs permission to use your camera, calls, storage and location.",Toast.LENGTH_LONG).show();
    
        } else {
    
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE,
                     Manifest.permission.MODIFY_PHONE_STATE, Manifest.permission.PROCESS_OUTGOING_CALLS,
                    Manifest.permission.PROCESS_INCOMING_CALLS, Manifest.permission.CALL_PHONE},1);
    
        }
    }
    
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[1] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[2] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[3] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[4] == PackageManager.PERMISSION_GRANTED) {
    
                    Toast.makeText(this,"Permission Granted.",Toast.LENGTH_LONG).show();
    
                } else {
    
                    Toast.makeText(this,"Permission Denied.",Toast.LENGTH_LONG).show();
    
                }
                break;
        }
    }
    
    ////////////////////////////////////////////////////////////////////////
    

    问题不在于清单权限,而在于所使用的URI。你是如何得到URI的?logcat输出告诉您URI用于未导出的内容提供商,或者URI未在授予对
    内容提供商的临时访问权限的
    意图中提供,请尝试此解决方案

    在OnCreate()方法中

    最后,在project.properties中,目标必须是23

    <uses-sdk
            android:minSdkVersion="13"
            android:targetSdkVersion="23" />
    
    target=android-23
    

    经过大量研究,我终于解决了这个问题。这个错误是因为谷歌照片需要一个持久的图像URI,即使你在清单文件中有运行时权限和标志的所有代码

    在下面答案的帮助下,我已经解决了我的问题。

    试试这个。我能看看你的清单文件吗???@jankigadhiya我在问题中添加了我的清单权限列表。你好,Hashmi。我已尝试在我的运行时权限中使用Manifest.permission.READ\u USER\u DICTIONARY,但它无法识别它。这个问题可能看起来很傻,但我是否需要导入任何内容,以便类能够识别此权限。我可以在清单中添加READ\u USER\u DICTIONARY权限。奇怪的问题是,您的其他权限是如何工作的。尝试添加此“导入android.Manifest”权限丢失时出现安全异常。所以试着追踪这个bug。如果manifest具有相同的权限,并且它在android M下工作。您的运行时权限代码工作不正常。请参阅编辑。嗨@Larry我刚刚发现我在6.0(也是Mashmello)中没有得到这个例外。正如您所说,这不是运行时权限例外。但是,由于我对android非常陌生,我无法理解你的建议。你能告诉我,我是否可以分享我的部分代码,这将有助于你向我指出问题所在。你从哪里获得Uri?我知道回答你的问题有点晚,因为我的工作是在iOS和android之间切换。对于您的问题-:有多个活动,PhotoDetailsActivity从OnactivityResult URi=data.getDta()获取URi;当他们将存储的URi从共享首选项传递到其他活动时,它正在崩溃。因此,问题在于其他活动无法访问URi。我用从gallery应用程序中选择图像进行了测试。我的应用程序没有崩溃,但如果用户从photos应用程序中选择图像,则会崩溃。我尝试了上述仍然崩溃的操作,但出现了相同的异常。我正在使用WRITE_EXTERNAL_存储和READ_EXTERNAL_存储来访问gallery图像运行时权限,还是需要其他运行时权限用于照片访问?
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
    <uses-sdk
            android:minSdkVersion="13"
            android:targetSdkVersion="23" />
    
    Version : Android 6.0
    
    target=android-23