2011-08-26 90 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

    ​​
  • 相关问题