国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android6.0運(yùn)行時(shí)權(quán)限的處理及解決辦法

GeekGhc / 759人閱讀

摘要:谷歌這樣做,可以讓用戶更加清醒的認(rèn)識(shí)相關(guān)權(quán)限的使用,在一定程度上更加人性化和保護(hù)了用戶的隱私。谷歌官方將權(quán)限分為了兩類,一個(gè)是正常權(quán)限,這類權(quán)限不涉及用戶隱私,是不需要用戶進(jìn)行授權(quán)的,比如訪問網(wǎng)絡(luò),手機(jī)震動(dòng)等。

問題背景

隨著今年Android6.0系統(tǒng)的國產(chǎn)ROM終于來了,適配6.0已經(jīng)勢在必行了。最近也有很多開發(fā)者在微信私聊和咨詢我遇到的問題,其中有一些都是關(guān)于Android6.0權(quán)限的,我感覺有必要寫一篇文章來解惑了。Runtime Permissions在6.0系統(tǒng)的幾個(gè)變化中,還是比較大的。

如果你在Android6.0系統(tǒng)的手機(jī)上如果遇到了這樣的錯(cuò)誤,必定跟其運(yùn)行時(shí)權(quán)限有關(guān)。

open failed: EACCES (Permission denied)

權(quán)限變化

在Adroid系統(tǒng)6.0以前,權(quán)限的處理是在App安裝時(shí)授權(quán),授權(quán)完了才能完成相關(guān)的安裝。而在6.0的系統(tǒng)上,是先安裝App,在安裝完之后,在使用相關(guān)權(quán)限的操作時(shí),才會(huì)彈出權(quán)限的提示框,用戶同意授權(quán)之后才能正常使用。谷歌這樣做,可以讓用戶更加清醒的認(rèn)識(shí)相關(guān)權(quán)限的使用,在一定程度上更加人性化和保護(hù)了用戶的隱私。

谷歌官方將權(quán)限分為了兩類,一個(gè)是正常權(quán)限(Normal Permissions),這類權(quán)限不涉及用戶隱私,是不需要用戶進(jìn)行授權(quán)的,比如訪問網(wǎng)絡(luò),手機(jī)震動(dòng)等。還有一類是危險(xiǎn)權(quán)限(Dangerous Permissions),一般是涉及到用戶隱私的,需要用戶進(jìn)行授權(quán),比如操作SD卡的寫入,相機(jī),錄音等。

Normal Permissions:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

Dangerous Permissions:

解決方法

看完官方文檔,還好解決方案還不是太難,也不是非常麻煩,當(dāng)然和以前相比還是有一點(diǎn)繁瑣的。廢話不多說了,解決方案如下。

檢查系統(tǒng)版本
private boolean canMakeSmores(){

    return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);

}

檢查系統(tǒng)版本的原因,顯而易見,如果是系統(tǒng)6.0及以上的,需要采用新的權(quán)限授權(quán)方法。

申請(qǐng)授權(quán)

舉個(gè)例子,如果你需要拍照操作,那么你就應(yīng)該在拍照操作的地方,先加上權(quán)限申請(qǐng)授權(quán)。方式如下:

String[] perms = {"android.permission.CAMERA"};

int permsRequestCode = 200; 

requestPermissions(perms, permsRequestCode);
授權(quán)回調(diào)處理
@Override

public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){

    switch(permsRequestCode){

        case 200:

            boolean cameraAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
            if(cameraAccepted){
                //授權(quán)成功之后,調(diào)用系統(tǒng)相機(jī)進(jìn)行拍照操作等
            }else{
                //用戶授權(quán)拒絕之后,友情提示一下就可以了
            }

            break;

    }

}
進(jìn)一步處理和完善

通過上面可以看出,只檢查系統(tǒng)版本了,如果授權(quán)過的權(quán)限,還需要再次去授權(quán)么?我們的判斷其實(shí)可以更完善一下,比如:

private boolean hasPermission(String permission){

    if(canMakeSmores()){

        return(checkSelfPermission(permission)==PackageManager.PERMISSION_GRANTED);

    }

    return true;

}

上面這段代碼,是先判斷系統(tǒng)版本,再判斷這個(gè)權(quán)限是否已經(jīng)授權(quán)過,這樣就不會(huì)重復(fù)了。

還有就是比如如果用戶第一次已經(jīng)拒絕過這個(gè)權(quán)限,下次再操作時(shí)怎么辦呢?還有一個(gè)更人性化的方法就是:

shouldShowRequestPermissionRationale(@NonNull String permission)

這個(gè)方法的作用:

第一次請(qǐng)求權(quán)限時(shí),用戶拒絕了,下一次:shouldShowRequestPermissionRationale() 返回 true,應(yīng)該顯示一些為什么需要這個(gè)權(quán)限的說明

第二次請(qǐng)求權(quán)限時(shí),用戶拒絕了,并選擇了“不在提醒”的選項(xiàng)時(shí):shouldShowRequestPermissionRationale() 返回 false

設(shè)備的策略禁止當(dāng)前應(yīng)用獲取這個(gè)權(quán)限的授權(quán):shouldShowRequestPermissionRationale() 返回 false

完結(jié)

到這里就基本介紹完結(jié)了,希望能夠?qū)Υ蠹矣兴鶐椭軌蜻M(jìn)一步理解Android6.0運(yùn)行時(shí)權(quán)限的使用。繼續(xù)加油吧,學(xué)習(xí)永無止境。

移動(dòng)開發(fā)者的聚集地,公眾號(hào)“非著名程序員”,每天一篇原創(chuàng)技術(shù)分享和移動(dòng)互聯(lián)網(wǎng)知識(shí)分享,微信公眾號(hào):smart_android,頭條號(hào)和百度百家賬號(hào)都是“非著名程序員”。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65877.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<