2015年6月10日 星期三

Android 開發 (一百) What's New in M Permission

在M的版本關於permission做了一個很大幅度的修改,原本的permission在下載時會出現如下方的提示

Screenshot_2015-06-09-22-52-56.png

使用者看到這個提示一定會問的問題是,為什麼需要那麼多權限,你是不是拿了這些權限去做了其他奇怪的事情?
這對app的下載造成了一定的阻礙

還有另一個問題就是,假設新版本比舊版本多了一個權限那麼app就無法自動更新下載,必須使用者確認才有辦法更新app

舉個例子來說
我新增了一個很強大的功能,而且我也如期完成了這個功能,我們行銷打算開始跑新功能的活動,由於我新增了一個權限造成這個版本的普及率要多一個月甚至更久才能普及,那行銷是否就無法如期去跑這個活動.

這其實對許多公司來說都是很大的痛點,明明功能就已經完成了,卻由於沒有良好的普及率造成活動無法如期舉行.

so...針對這兩個問題

android M 提出了新的解決方案

out16.gif

上面的圖示你可以注意到,下載的時候不再有permission的視窗跳出,

其實你不需要擔心,permission並不是不見了,而是只有在需要的時候才會跳出
讓我們再看看下面的圖片

out16.gif

假設上面的按鈕需要使用到phone calls and camera的權限,我可以在使用者點擊的時候才去檢查是否擁有這些權限,如果沒有android會跳出如上的提示視窗跟使用者要求權限,只有在permission 被允許之後,我們才能繼續做後續的事情,例如錄影...

其實這對使用者的經驗是一大提升,因為使用者可以很確切地知道你的權限是用在哪個地方,當然前提是你沒有一打開app就把所有權限一次拿完XD

不過由於這些使用者經驗的提升,也造成了程式碼上一定幅度的修改

首先以上面的例子來說當button click我必須做檢查我是否擁有這個權限

 if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {

如果沒有權限我們可以利用requestPermissions來取得我們需要的權限
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},
                            PERMISSION_REQUEST_PHONE);


requestPermissions之後會跳出上方的提示視窗,必須等使用者按下allow or deny之後才會產生callback

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

我們可以在onRequestPermissionsResult處理相關的動作,例如當permission成功取得時應該顯示啥,或者當沒有成功取得權限時應該怎麼辦之類的動作

其實以一個開發者的角度來說,雖然有那麼多的好處,但是這其實提升了程式的複雜度,讓原本的流程又多出了一個callback 判斷時間點,真是有利必有弊啊

不過目前這個功能並不是強制性的,所以舊app還是可以走原本的邏輯,也就是下載時讓使用者看到所有個權限,並且一次性的取得所有權限

但是如果要使用新的功能則必須將下面三個設定都使用新的設定才行
compileSdkVersion 'android-MNC'
minSdkVersion "MNC"
targetSdkVersion "MNC"

如果使用了MNC版本請記得一定要做permission check 否則就會出現

螢幕快照 2015-06-03 下午9.56.53.png


最後還是要附上sampel code
https://github.com/nightbear1009/M-Permission

沒有留言:

張貼留言