1. 程式人生 > >【Android運行時權限申請快速學習教程】

【Android運行時權限申請快速學習教程】

設備 uri hub 沒有 html 權力 https 後來 location

1. Android權限介紹


  Android權限是Android應用在設備上運行所需要的權力,義務就是為用戶帶來此Android應用的功能。

  問題來源:在Android6.0版本之前,根據App在AndroidManifest申請的權限,在安裝此App的時候進行提示權限允許,不允許就不給裝不給用,那麽我們只能默默的忍受這個APP對我們隱私的侵蝕(Eg.通訊錄的讀取權限)。

  解決辦法:後來Google發現,誒,這樣會導致Android用戶們想用這個APP的某些功能而不能用。因此,在Android6.0將權限分為兩類,即Normal Permissions(普通權限)與Dangerous Permission(危險權限),在APP在運行時所需要的權限可進行動態申請。

2. Android運行時權限申請(基於easypermissions)


2.1 問題:

  基於easypermissions在Android 6.0版本上申請CAMERA與ACCESS_FINE_LOCATION權限。

2.2 解決問題過程:

  I. 在使用權限的Activity中加入onRequestPermissionsReult()請求權限函數。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } }

  II. 自定義methodRequiresTwoPermission()需要運行時權限的函數。

@AfterPermissionGranted(RC_CAMERA_AND_LOCATION)
private void methodRequiresTwoPermission() {
    String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION};
    if (EasyPermissions.hasPermissions(this, perms)) { //1、首先檢查是否存在此權限
        // Already have permission, do the thing
        // ...
    } else {
        // Do not have permissions, request them now
        EasyPermissions.requestPermissions(this, getString(R.string.camera_and_location_rationale),
                RC_CAMERA_AND_LOCATION, perms); // 2、沒有權限即申請
    }
}

  III. 方便調試,用戶究竟是授權或者拒決哪項權限可重寫Activity的onPermissionsGranted與onPermissionsDenied函數。

    @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
     // requestCode就是剛剛RC_CAMERA_AND_LOCATION
// Some permissions have been granted // ... } @Override public void onPermissionsDenied(int requestCode, List<String> list) {
     // Some permissions have been denied
     //...
  }

3. 總結


  第一步,為了兼容Android6.0版本以下的權限申請,我們還是需要在AndroidManifest中申明我們需要的權限;

  第二步,Android6.0版本的運行時權限申請使用基於easypermissions進行動態申請。

  另外,屬於同一權限組裏面的其中一個權限被授權,權限組裏面剩余的權限都會被授權。

4.參考:


  https://developer.android.com/guide/topics/security/permissions.html?hl=zh-cn#normal-dangerous

  http://blog.csdn.net/lmj623565791/article/details/50709663

  https://github.com/googlesamples/easypermissions

  http://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ

【Android運行時權限申請快速學習教程】