2016-12-24 145 views
0

为询问权限而编写的方法。我在问多个权限。运行时权限异常

private void askForPermissions() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      int contactsPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS); 
      int extStoragePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
      int cameraPermission = checkSelfPermission(Manifest.permission.CAMERA); 
      int recordPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO); 
      int internetPermission = checkSelfPermission(Manifest.permission.INTERNET); 

      Log.e("Start_Permission1",""+(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)); 
      Log.e("Start_Permission2",""+(contactsPermission != PackageManager.PERMISSION_GRANTED)); 
      Log.e("Start_Permission3",""+(extStoragePermission != PackageManager.PERMISSION_GRANTED)); 
      Log.e("Start_Permission4",""+(cameraPermission != PackageManager.PERMISSION_GRANTED)); 
      Log.e("Start_Permission5",""+(recordPermission != PackageManager.PERMISSION_GRANTED)); 
      Log.e("Start_Permission6",""+(internetPermission != PackageManager.PERMISSION_GRANTED)); 


      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && contactsPermission != PackageManager.PERMISSION_GRANTED && extStoragePermission != PackageManager.PERMISSION_GRANTED && cameraPermission != PackageManager.PERMISSION_GRANTED && recordPermission != PackageManager.PERMISSION_GRANTED) { 
       Log.e("Start","here i am"); 
       requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, 
         Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_CONTACTS}, REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 

      } 
      Log.e("Start_permission","Asking done.."); 
} 
In onCreate method: 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_start); 

    // First take all permissions 
     askForPermissions(); 

     if (!checkNetworkAvailability()) { 
      Toast.makeText(getApplicationContext(), "Sorry! You need Internet Connection", Toast.LENGTH_LONG).show(); 
      spinner.setVisibility(View.INVISIBLE); 

     } else { 

      if (populateUserData()) { 
       spinner = (ProgressBar) findViewById(R.id.spinner); 
       spinner.setVisibility(ProgressBar.VISIBLE); 
       Log.e("Start_populateUSrData", "User data populated"); 

       fetchContacts(); 
    } 

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, 
              int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // Permission Granted 
        //insertDummyContact(); 
       } else { 
        // Permission Denied 
        Toast.makeText(Start.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT) 
          .show(); 
       } 
       break; 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 

日志:

12-24 16:53:26.251 1465-1465/com.moodoff E/Minikin: addFont failed to create font /system/fonts/NanumGothic.ttf 
12-24 16:53:26.252 1465-1465/com.moodoff E/Minikin: addFont failed to create font /system/fonts/DroidSansFallback.ttf 
12-24 16:53:26.252 1465-1465/com.moodoff E/Minikin: addFont failed to create font /system/fonts/MTLmr3m.ttf 
12-24 16:53:26.434 1465-1465/com.moodoff E/MultiWindowProxy: getServiceInstance failed! 
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission1: true 
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission2: true 
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission3: true 
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission4: true 
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission5: true 
12-24 16:53:26.596 1465-1465/com.moodoff E/Start_Permission6: false 
12-24 16:53:26.596 1465-1465/com.moodoff E/Start: here i am 
12-24 16:53:26.618 1465-1465/com.moodoff E/Start_permission: Asking done.. 
12-24 16:53:26.876 1465-1572/com.moodoff E/AndroidRuntime: FATAL EXCEPTION: Thread-1132 
                  Process: com.moodoff, PID: 1465 
                  java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{292d428 1465:com.moodoff/u0a207} (pid=1465, uid=10207) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS 
                   at android.os.Parcel.readException(Parcel.java:1599) 
                   at android.os.Parcel.readException(Parcel.java:1552) 
                   at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3847) 
                   at android.app.ActivityThread.acquireProvider(ActivityThread.java:5062) 
                   at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2026) 
                   at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1517) 
                   at android.content.ContentResolver.query(ContentResolver.java:482) 
                   at android.content.ContentResolver.query(ContentResolver.java:441) 
                   at com.moodoff.ContactList.getContactNames(ContactList.java:135) 
                   at com.moodoff.helper.DBHelper$1.run(DBHelper.java:73) 
                   at java.lang.Thread.run(Thread.java:818) 

Inspite的,我加入askForPermission在开始的时候是读书的接触和呕吐此权限拒绝错误...无接触读取线的应用是要求的事实权限正常,工作正常。 可以做些什么?

+0

请参阅本http://stackoverflow.com/questions/34040355/how-to-check-the-multiple-许可在单一的请求在Android-M – sukumar

回答

3

您在这里没有最小的,完整的和可验证的示例。但是,在onCreate()中,如果checkNetworkAvailability()返回truepopulateUserData()返回true,尽管事实上您可能还没有权限,但您仍然拨打fetchContacts()

与Android中的许多事情一样,requestPermissions()是异步的。当您的requestPermissions()调用返回时,用户还没有被问到有关这些权限的问题,并且您还没有这些权限。如果您正在请求权限,则只能在onRequestPermissionsResult()之前根据该权限执行初始化,并且仅在用户授予权限时才能执行初始化。

+0

神奇。让我看看我可以如何同步这一点。 – Santanu

0

曾有同样的问题,解决它通过添加清单相同的权限,即使是那些被运行时权限