Android6 0权限机制(一):介绍
本篇文章已授權(quán)微信公眾號(hào) hongyangAndroid (鴻洋)獨(dú)家發(fā)布 Android6.0權(quán)限機(jī)制(一):介紹 Android6.0權(quán)限機(jī)制(二):封裝 Android6.0權(quán)限機(jī)制(三):6.0以前國產(chǎn)手機(jī)權(quán)限處理
為何google在6.0加入這個(gè)權(quán)限機(jī)制
android6.0之前其實(shí)也有權(quán)限機(jī)制,很簡(jiǎn)單就是開發(fā)者在manifest.xml注冊(cè),用戶安裝app時(shí)候,當(dāng)做權(quán)限清單列出來告知用戶我需要這些個(gè)權(quán)限,但是這樣用戶基本不會(huì)去看,導(dǎo)致app權(quán)限濫用造成安全隱患。
權(quán)限分類
Android權(quán)限有100多種不可能每種都去運(yùn)行時(shí)授權(quán),因此google把權(quán)限分為兩類: 1.普通權(quán)限:例如網(wǎng)絡(luò)請(qǐng)求等,按照老的權(quán)限機(jī)制 2.危險(xiǎn)權(quán)限:9種共24個(gè)(電話,短信,sd卡,位置,攝像頭,傳感器,日歷,錄音,聯(lián)系人),就是我們要?jiǎng)討B(tài)申請(qǐng)的。 ? 用adb命令查看危險(xiǎn)權(quán)限列表:(tip:記住9種24類)
adb shell pm list permissions -d -g 復(fù)制代碼Dangerous Permissions:group:android.permission-group.CONTACTSpermission:android.permission.WRITE_CONTACTSpermission:android.permission.GET_ACCOUNTSpermission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONEpermission:android.permission.READ_CALL_LOGpermission:android.permission.READ_PHONE_STATEpermission:android.permission.CALL_PHONEpermission:android.permission.WRITE_CALL_LOGpermission:android.permission.USE_SIPpermission:android.permission.PROCESS_OUTGOING_CALLSpermission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDARpermission:android.permission.READ_CALENDARpermission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERApermission:android.permission.CAMERAgroup:android.permission-group.SENSORSpermission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATIONpermission:android.permission.ACCESS_FINE_LOCATIONpermission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGEpermission:android.permission.READ_EXTERNAL_STORAGEpermission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONEpermission:android.permission.RECORD_AUDIOgroup:android.permission-group.SMSpermission:android.permission.READ_SMSpermission:android.permission.RECEIVE_WAP_PUSHpermission:android.permission.RECEIVE_MMSpermission:android.permission.RECEIVE_SMSpermission:android.permission.SEND_SMSpermission:android.permission.READ_CELL_BROADCASTS 復(fù)制代碼看到上面的dangerous permissions,會(huì)發(fā)現(xiàn)一個(gè)問題,好像危險(xiǎn)權(quán)限都是一組一組的那么有個(gè)問題:分組對(duì)我們的權(quán)限機(jī)制有什么影響嗎?的確是有影響的,如果app運(yùn)行在Android 6.x的機(jī)器上,對(duì)于授權(quán)機(jī)制是這樣的。如果你申請(qǐng)某個(gè)危險(xiǎn)的權(quán)限,假設(shè)你的app早已被用戶授權(quán)了同一組的某個(gè)危險(xiǎn)權(quán)限,那么系統(tǒng)會(huì)立即授權(quán),而不需要用戶去點(diǎn)擊授權(quán)。比如你的app對(duì)READ_CONTACTS已經(jīng)授權(quán)了,當(dāng)你的app申請(qǐng)WRITE_CONTACTS時(shí),系統(tǒng)會(huì)直接授權(quán)通過。此外,對(duì)于申請(qǐng)時(shí)彈出的dialog上面的文本說明也是對(duì)整個(gè)權(quán)限組的說明,而不是單個(gè)權(quán)限(ps:這個(gè)dialog是不能進(jìn)行定制的)。不過需要注意的是,不要對(duì)權(quán)限組過多的依賴,盡可能對(duì)每個(gè)危險(xiǎn)權(quán)限都進(jìn)行正常流程的申請(qǐng),因?yàn)樵诤笃诘陌姹局羞@個(gè)權(quán)限組可能會(huì)產(chǎn)生變化。
怎么兼容
1.假設(shè)我們的項(xiàng)目之前沒加這個(gè)權(quán)限機(jī)制,那現(xiàn)在我們?cè)趺刺幚砟?#xff0c;要不要加這個(gè)權(quán)限判斷,這個(gè)取決與app的版本兼容性也就是你們是否愿意為Android6.0以上的用戶們處理這個(gè)問題。targetSdkVersion這個(gè)屬性就是控制是否要引入權(quán)限機(jī)制的開關(guān)。
- 項(xiàng)目中targetSdkVersion<23: 按照老的權(quán)限機(jī)制,只在manifest聲明就可以了,運(yùn)行不會(huì)報(bào)錯(cuò),但是會(huì)有隱患: 比如,我的APP有個(gè)撥號(hào)功能,把targetSdkVersion=21,安裝到API23(Android6.0)的設(shè)備,可以正常撥號(hào),看似正常。 但是用戶可以直接去設(shè)置里面關(guān)掉權(quán)限:
我在模擬器上有這個(gè)警告提示,但不保證所有手機(jī)都會(huì)有這個(gè)提示!這時(shí)再打開APP就無法撥號(hào)了,由于沒有檢查權(quán)限,用戶得不到任何提示,一臉懵逼。
- targetSdkVersion>=23: 這時(shí)就需要在代碼中檢查權(quán)限了,否則打開app去執(zhí)行需要權(quán)限的操作會(huì)崩潰。如果關(guān)閉權(quán)限將會(huì)彈出提示框提示你開啟權(quán)限。
2.如果app原先的targetSdkVersion低于23,現(xiàn)在升級(jí)到targetSdkVersion=23的app,那么里面的權(quán)限默認(rèn)全部開啟!除非用戶卸載重裝這個(gè)app,才是默認(rèn)關(guān)閉所有權(quán)限
關(guān)于讀寫SD卡權(quán)限
在6.0之前由于讀寫SD沒有限制,導(dǎo)致sd卡目錄被app濫用,于是google把sd卡續(xù)寫權(quán)限列為危險(xiǎn)權(quán)限,如果開發(fā)者不想申請(qǐng)sd卡讀寫權(quán)限,可以訪問0/Android/data/包名 這個(gè)目錄,不需要權(quán)限可以隨便訪問,Android也是建議開發(fā)者將這個(gè)目錄作為app的緩存目錄
使用
- 首先配置build.gradle,targetSdkVersion版本應(yīng)該>=23,然后導(dǎo)入support-v4包:
- manifest.xml聲明權(quán)限
- 在Activity或者Fragment中判斷是否開啟了這個(gè)權(quán)限,如果開啟了就撥號(hào),沒有的話就申請(qǐng)權(quán)限:
界面彈出框:拒絕或者同意,回調(diào)兩種結(jié)果:
[圖片上傳中。。。(2)]
public class MyActivity extends Activity {private Button btn;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity);btn = (Button) findViewById(R.id.textView);btn.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {int check = ContextCompat.checkSelfPermission(MyActivity.this, Manifest.permission.CALL_PHONE);if(check== PackageManager.PERMISSION_GRANTED){call();}else {ActivityCompat.requestPermissions(MyActivity.this,new String[]{Manifest.permission.CALL_PHONE}, 1);}}});}public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if(requestCode==1){if(grantResults[0]==PackageManager.PERMISSION_GRANTED){call();}else {Toast.makeText(MyActivity.this,"沒有撥打電話權(quán)限",Toast.LENGTH_SHORT).show();}}}private void call(){Intent intent = new Intent();intent.setData(Uri.parse("tel://1212121212"));intent.setAction(Intent.ACTION_CALL);startActivity(intent);} } 復(fù)制代碼- 不再提示的處理: 如果用戶勾選了不再提示,并且拒絕了權(quán)限,那么后面不會(huì)再彈框,并且結(jié)果一直回調(diào)到?jīng)]有權(quán)限,此時(shí)根據(jù)產(chǎn)品需求處理,一般2種方法:
總結(jié)
以上是生活随笔為你收集整理的Android6 0权限机制(一):介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaweb学习中的路径问题
- 下一篇: Android TimeAnimator