2011-08-26 42 views
78

我設計了一個函數,可以從SD中獲取/設置資源,如果沒有從sd中找到資源,則從資產中獲取資源,如果可能,將資產寫回SD
此函數可通過方法調用檢查SD是否已安裝並可訪問...如何在運行時檢查權限而不拋出SecurityException?

boolean bSDisAvalaible = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 

我設計的功能可以從一個應用程序(項目)被用於另一個(帶或不帶android.permission.WRITE_EXTERNAL_STORAGE)

然後我想檢查當前應用程序具有此特殊的權限而不用SecurityException。

它是否存在一個「很好」的方式來查詢運行時當前定義的權限?

回答

160

您可以使用Context.checkCallingorSelfPermission()功能。這裏有一個例子:

private boolean checkWriteExternalPermission() 
{ 
    String permission = android.Manifest.permission.WRITE_EXTERNAL_STORAGE; 
    int res = getContext().checkCallingOrSelfPermission(permission); 
    return (res == PackageManager.PERMISSION_GRANTED);    
} 
+0

此方法可能存在安全風險。 – TalMihr

+13

@TalMihr你爲什麼認爲checkCallingOrSelfPermission()會帶來安全風險? – William

+0

@inazaruk,如果沒有系統授予,是否可以授予權限? –

46

這是另一種解決方案,以及

PackageManager pm = context.getPackageManager(); 
int hasPerm = pm.checkPermission(
    android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 
    context.getPackageName()); 
if (hasPerm != PackageManager.PERMISSION_GRANTED) { 
    // do stuff 
} 
+0

因此,我應該只包裝這個代碼如果陳述?我做了這件事,看看用戶是否正在接聽電話或正在通話中以使音頻靜音: http://snag.gy/uIxsv.jpg –

+0

這樣做會讓我犯這麼多錯誤... http: //snag.gy/cF7JU.jpg –

+0

調用軟件包以獲取權限或iPC的區別是什麼? – htafoya

17

您也可以使用此:

private boolean doesUserHavePermission() 
{ 
    int result = context.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    return result == PackageManager.PERMISSION_GRANTED; 
} 
11

像谷歌documentation

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

共享我的方法在案例中有人需要他們:

/** Determines if the context calling has the required permission 
* @param context - the IPC context 
* @param permissions - The permissions to check 
* @return true if the IPC has the granted permission 
*/ 
public static boolean hasPermission(Context context, String permission) { 

    int res = context.checkCallingOrSelfPermission(permission); 

    Log.v(TAG, "permission: " + permission + " = \t\t" + 
    (res == PackageManager.PERMISSION_GRANTED ? "GRANTED" : "DENIED")); 

    return res == PackageManager.PERMISSION_GRANTED; 

} 

/** Determines if the context calling has the required permissions 
* @param context - the IPC context 
* @param permissions - The permissions to check 
* @return true if the IPC has the granted permission 
*/ 
public static boolean hasPermissions(Context context, String... permissions) { 

    boolean hasAllPermissions = true; 

    for(String permission : permissions) { 
     //you can return false instead of assigning, but by assigning you can log all permission values 
     if (! hasPermission(context, permission)) {hasAllPermissions = false; } 
    } 

    return hasAllPermissions; 

} 

,並呼籲它:

boolean hasAndroidPermissions = SystemUtils.hasPermissions(mContext, new String[] { 
       android.Manifest.permission.ACCESS_WIFI_STATE, 
       android.Manifest.permission.READ_PHONE_STATE, 
       android.Manifest.permission.ACCESS_NETWORK_STATE, 
       android.Manifest.permission.INTERNET, 
     }); 
1

這對我來說工作正常的代碼是: -

final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 102; 
    if ((ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { 

       requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
         MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); 
      } else { 
     // user already provided permission 
       // perform function for what you want to achieve 
    } 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 

    boolean canUseExternalStorage = false; 

    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: { 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       canUseExternalStorage = true; 
      } 

      if (!canUseExternalStorage) { 
       Toast.makeText(getActivity(), "Cannot use this feature without requested permission", Toast.LENGTH_SHORT).show(); 
      } else { 
       // user now provided permission 
       // perform function for what you want to achieve 
      } 
     } 
     } 
} 
5

您應該檢查以下列方式權限(如Android permissions所述):

int result = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE); 

然後,比較你的結果要麼:

result == PackageManager.PERMISSION_DENIED 

或:

result == PackageManager.PERMISSION_GRANTED 
+0

謝謝。這很有幫助。 –

0

啓用GPS定位的Android工作室

  1. 添加權限項在AndroidManifest.xml

  • MapsActivity。的java

    ​​
  • 相關問題