Android權限 - 第二篇

原文鏈接 : Permissions – Part 2

在Marshmallow(棉花糖,Android6.0版本)中Android添加了一個新的權限模塊,需要開發者在授權的時候做一些不同的處理。在這一系列中,我們從技術角度看下如何處理請求的權限和如何提供流暢的用戶體驗。

Icon_no_permission

之前我們討論了如何檢查我們需要的權限是否被授予,但是我們沒有討論在適當的地方請求缺失的權限。在這篇文章中,我們來看一看在所有Acitivity中,在沒有很多重復代碼的情況下我們是如何請求和檢測必要權限的。請記住,接下來的都是在Marshmallow或之后的版本(更早OS層Manifest聲明的權限會被直接授權),如果你在builds文件中特別標明targetSdkVersion=23或更高,你就需要實現這種檢測。

所以第一件事情是我們要知道權限請求模塊是如何工作的。就像我們已經討論過的,標準權限會被直接授權,但是危險的權限的請求需要用戶授予。用戶授予需要的權限是很容易的事情,但我們需要考慮到用戶沒有授予權限。針對這個app,我們最終編寫成一個對用戶來說并不是非常明顯的我們需要RECORD_AUDIO權限的原因,所以,我們要準備通知用戶為什么這個是需要的。

從用戶的角度來看,工作方式是第一次運行app的時候請求用戶授權需要的權限:

Part2-first-run

如果他們授權了這個權限,萬事好說,我們就不急了。但是如果他們拒絕了這個權限,我們就要反復的詢問需要被授權的權限:

Part2-second-run

請注意如果用戶之前拒絕了權限申請,它們會顯示一個不再顯示這個權限請求的選項。如果用戶選擇了一個選項,代碼中任何進一步的嘗試權限請求會被自動拒絕。做為開發者要清楚這個問題,做好預留措施。

用戶可以進一步設置,進到應用的設置頁面,可以授權或拒絕任何應用需要的權限。這就是為什么不僅僅在應用啟動的時候檢測需要的權限是否被授予的重要性,而且每個activity的權限都隨時都有可能發生變化。

我們將要管理這個的模式是一個單獨的負責請求權限的Activity,app中所有的其他Activity都需要檢測所需要的權限,如果他們沒有被授權PermissionsActivity會被回調。

讓我稍微更新下MainActivity

MainActivity.java

public class MainActivity extends AppCompatActivity {

    static final String[] PERMISSIONS = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.MODIFY_AUDIO_SETTINGS};
    private PermissionsChecker checker;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        checker = new PermissionsChecker(this);
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (checker.lacksPermissions(PERMISSIONS)) {
            startPermissionsActivity();
        }
    }

    private void startPermissionsActivity() {
        PermissionsActivity.startActivity(this, PERMISSIONS);
    }
}

我們把權限檢測代碼放到onResume()。這就解決了用戶暫停我們的app,切換到設置頁面,拒絕了權限,然后又返回到我們的app的情況。好,這只是一個小概率事件,但對于預防崩潰是值得做的。

我們實現的這個基礎模式是無論何時Activity被恢復我們都可以確定有操作Activity的所需要的權限。如果我們沒有權限,我們將控制權交給負責獲得需要的權限的PermissionsActivity。雖說這感覺像是一個防御性方案,但我認為這個一個不需要大量代碼的明智的方案。PermissionsChecker內封裝好了所有檢測邏輯,請求調用是在PermissionsActivity。

輕量級的權限檢測組件是重要的,因為我們可以相對簡單的檢測需要的權限,在Activity有必要請求權限的地方請求是更浪費的。

在下一篇文章中我們會看到PermissionsActivity如何處理這個權限的請求,探索如果用戶拒絕了一個我們需要的權限,如何告知用戶我們為什么需要。

這篇文章的源碼在這里。PermissionsActivity代碼中有一個占位符,我會在下篇文章中擴展,所以它現在不是一個完整功能的代碼。

? 2016, Mark Allison. All rights reserved.


所屬標簽


25选5玩法中奖