2016-02-29 30 views
0

我是Android新手。我正在通過啓動應用程序撥打電話。我從菜單中隱藏我的應用程序圖標。我成功地打開從撥號應用程序在豆形軟糖和奇巧設備,但是當我在棒棒糖和棉花糖系統開放的應用讓我異常喜歡,Android java.lang.SecurityException發生

E/GooglePlusContactsSync: Failed to clear out contacts 
                 java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{ff7ceee 26321:com.google.android.apps.plus/u0a89} (pid=26321, uid=10089) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS 
                  at android.os.Parcel.readException(Parcel.java:1620) 
                  at android.os.Parcel.readException(Parcel.java:1573) 
                  at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3594) 
                  at android.app.ActivityThread.acquireProvider(ActivityThread.java:4799) 
                  at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2018) 
                  at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1466) 
                  at android.content.ContentResolver.query(ContentResolver.java:475) 
                  at android.content.ContentResolver.query(ContentResolver.java:434) 
                  at dit.a(PG:440) 
                  at dit.b(PG:1388) 
                  at diu.run(PG:325) 
                  at java.lang.Thread.run(Thread.java:818) 

E/DatabaseUtils: Writing exception to parcel 
              java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/fs_id from pid=2208, uid=10089 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 
               at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 
               at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 
               at android.content.ContentProvider$Transport.query(ContentProvider.java:211) 
               at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) 
               at android.os.Binder.execTransact(Binder.java:453) 

然後應用自動關閉。

回答

2

Android 6.0(Marshmallow)引入了一種處理Android權限的新方法。 Read more about it here

在在Android 6.0(API級別23)開始,用戶權限授予 的應用程序,而應用程序正在運行,而不是當他們安裝應用程序。此 方法簡化了應用安裝過程,因爲用戶在安裝或更新應用時不需要授予權限 。它也 給用戶更多的控制應用程序的功能;例如, 用戶可以選擇給相機應用程序訪問相機,但不是 到設備位置。用戶可以在任何 時間通過轉到應用的設置屏幕來撤銷權限。

您需要在清單聲明您的權限。 檢查當前狀態:

// Assume thisActivity is the current activity 
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, 
     Manifest.permission.WRITE_CALENDAR); 

,並要求他們,如果你需要:

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.READ_CONTACTS) 
     != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
      Manifest.permission.READ_CONTACTS)) { 

     // Show an expanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 

    } else { 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(thisActivity, 
       new String[]{Manifest.permission.READ_CONTACTS}, 
       MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

     // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

爲了應對Android的運行許可,我通常使用this library。它確實有助於減少代碼樣板。

0

從Android 6.0開始,我們需要檢查權限是否已被授予,所以爲了讀取聯繫人,您需要首先檢查read_contacts權限是否已被授予。

嘗試:

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[]{Manifest.permission.CAMERA}, 101); 
     return; 
    } else { 
     // permission already granted 
    } 

和偵聽授予權限

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case 101: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // permission granted 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
    } 
+0

我還檢查許可後動態,但它無法正常工作。我嘗試這個代碼。 –

相關問題