2017-04-19 110 views
0

我試圖請求在應用程序中讀取聯繫人的能力,並遵循了幾個教程。所有這些在這個過程中使用幾乎相同的代碼。下面是我的MainActivity.java文件中的代碼,它應該請求權限。未在運行時詢問而授予Android聯繫人權限

private void checkContactPermissions() 
    { 
     if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { 
      Log.i(TAG, "Contacts permission NOT granted"); 
      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); 
     } 
     else 
     { 
      Log.i(TAG, "Contacts permission granted"); 
      readContacts(); 
     } 
    } 

我manifest.xml中還包括行:

<uses-permission android:name="android.permission.READ_CONTACTS" /> 

當應用程序運行時,無論是在模擬器或物理調試器,它不要求許可,但是日誌指出的是,許可被授予。我已經通過轉到設置並檢查它被關閉來確認權限已關閉。還有什麼會導致應用程序執行權限被授予。

+1

改變這種==來!=在此之後,Manifest.permission.READ_CONTACTS) –

+0

我真的不敢相信我是這個盲人。謝謝。 –

回答

0

由於Divyesh帕特爾指出,我有布爾statemetns混合起來,應該是

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) 

不是

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) 
0

試試這個,

private Context mContext=YourActivity.this; 

private static final int REQUEST = 112; 

if (Build.VERSION.SDK_INT >= 23) { 
    String[] PERMISSIONS = {android.Manifest.permission.READ_CONTACTS}; 
    if (!hasPermissions(mContext, PERMISSIONS)) { 
     ActivityCompat.requestPermissions((Activity) mContext, PERMISSIONS, REQUEST); 
    } else { 
     readContacts(); 
    } 
} else { 
    readContacts(); 
} 

獲取權限結果

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 
     case REQUEST: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        readContacts(); 
      } else { 
       Toast.makeText(mContext, "The app was not allowed to read your contact", Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 

的棉花糖

private static boolean hasPermissions(Context context, String... permissions) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
     for (String permission : permissions) { 
      if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

清單檢查權限

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
0

你這裏要注意的是,這些權限只要求重要的東西版本> 23的設備,如果您的Android版本較低,那麼只有像redmi這樣的一些模型,您必須手動調用權限。

否則版本< 23一般不要求權限。 如果你把清單。它會自動把它,特別是當你通過USB安裝應用程序。

0

如果任何設備低於< 23或在應用manifist文件maxtarget版本操作系統版本低於< 23,那麼它不會在運行時問權限,因爲雖然應用這些設備,你實際上發放的允許你提到的所有上安裝。

因此,只有在設備操作系統版本高於22(Lolipop)的情況下,運行時權限纔有可能。

希望這會有所幫助..

@Rajesh

+0

嗨Rajesh。我已經在操作系統版本23和更低版本的清單中指定了所需的權限,但是我正在API 24和25上測試運行時權限,但他們沒有提出。事實證明,我只是讓我的布爾語句錯了。 –