2016-02-02 18 views
10

Android Developer Documentation給在運行時請求權限的這個例子:Android的運行permissions-如何實現

// 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. 
    } 
} 

什麼是在這個例子中「MY_PERMISSIONS_REQUEST_READ_CONTACTS」?它說這是一個應用程序定義的int常量,但這是否意味着我應該創建一個Constants.java並聲明一個公共靜態int?價值應該是什麼?

在其他例子中,我看到人們在這裏使用1,或者0或者0xFFEEDDCC,但是我找不到它是什麼的解釋。有人可以向我解釋什麼需要去這裏,爲什麼? (在我的情況下,我需要確保應用程序有權訪問正確的位置)

ActivityCompat文檔中提到「特定於應用程序的請求代碼與報告給onRequestPermissionsResult的結果相匹配」?這對我沒有幫助。

+0

[Android權限 - 艙單或android.manifest]的可能的複製(http://stackoverflow.com/questions/34901870/android-permissions-manifest-or-android-manifest) – JpCrow

+0

您可以檢查我創建了一個類,並使用它的碎片github.com/mptrista/PermissionHelper這是一個片段,並在請求一個許可的情況下。 – toshkinl

回答

13

什麼是在這個例子中的「MY_PERMISSIONS_REQUEST_READ_CONTACTS」?

它是一種int,以配合特定的requestPermissions()呼叫到相應onRequestPermissionsResult()回調。

在封面下,requestPermissions()使用startActivityForResult();這個int的作用與它在startActivityForResult()中的作用相同。

這是否意味着我應該做一個Constants.java並聲明一個公共靜態int?

我只是在活動中將其設爲private static final int。但是,你可以在任何你想要的地方聲明它。

該值應該是什麼?

我似乎記得它需要低於0x8000000,但否則它可以是任何你想要的。您在活動中爲每個requestPermissions()調用使用的值應該明確地爲int,但實際的數字並不重要。

如果您的活動只有一個requestPermissions()調用,那麼int值真的沒有關係。但是許多應用程序在一個活動中會有幾個requestPermissions()調用。在這種情況下,開發人員可能需要知道onRequestPermissionsResult()這個結果是什麼請求。

2

請看「處理權限請求響應」下的文檔,稍後會看到它的用途。

稱爲onRequestPermissionsResult回調方法被送回相同的代碼作爲參數,讓您知道正在請求/授予其權限:

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

由於常數所使用的是隻有你可以給它的任何值你喜歡作爲public static final int。被請求的每個權限都需要自己的常量。

0
public class SplashActivity extends RuntimePermissionsActivity { 


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

    SplashActivity.super.requestAppPermissions(new 
        String[]{android.Manifest.permission.READ_PHONE_STATE, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE, 
        Manifest.permission.READ_EXTERNAL_STORAGE}, R.string.app_name 
      , 20); 

} 

@Override 
public void onPermissionsGranted(int requestCode) { 


    try { 
     TelephonyManager tele = (TelephonyManager) getApplicationContext() 
       .getSystemService(Context.TELEPHONY_SERVICE); 

     String imei =tele.getDeviceId() 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public abstract class RuntimePermissionsActivity extends AppCompatActivity { 
private SparseIntArray mErrorString; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mErrorString = new SparseIntArray(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    for (int permission : grantResults) { 
     permissionCheck = permissionCheck + permission; 
    } 
    if ((grantResults.length > 0) && permissionCheck == PackageManager.PERMISSION_GRANTED) { 
     onPermissionsGranted(requestCode); 
    } else { 

     finish(); 

    } 
} 

public void requestAppPermissions(final String[] requestedPermissions, 
            final int stringId, final int requestCode) { 
    mErrorString.put(requestCode, stringId); 
    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    boolean shouldShowRequestPermissionRationale = false; 
    for (String permission : requestedPermissions) { 
     permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission); 
     shouldShowRequestPermissionRationale = shouldShowRequestPermissionRationale || ActivityCompat.shouldShowRequestPermissionRationale(this, permission); 
    } 
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 
     if (shouldShowRequestPermissionRationale) { 
      ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode); 
      /*Snackbar.make(findViewById(android.R.id.content), stringId, 
        Snackbar.LENGTH_INDEFINITE).setAction("GRANT", 
        new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode); 
         } 
        }).show();*/ 
     } else { 
      ActivityCompat.requestPermissions(this, requestedPermissions, requestCode); 
     } 
    } else { 
     onPermissionsGranted(requestCode); 
    } 
} 

public abstract void onPermissionsGranted(int requestCode); 

}