編輯:關於Android編程
如果APP運行在Android 6.0或以上版本的手機,並且target sdk>=23,那麼在使用一些相對敏感的權限時,需要征求用戶的許可。比如讀寫sdcard,攝像,聯系人信息等。
android 6.0發布幾個月之後,升級率很低,很少應用會使用sdk23編譯項目,如果要編譯,就必須了解request權限的一些事。
Android 6.0不僅UI改進很多,體驗也不錯哦。仿照iOS權限做法,在原有的AndroidManifest.xml聲明權限的基礎上,新增了運行時權限動態檢測,以下權限都是dangerous permissions ,需要在運行時判斷:
1. 身體傳感器
2. 日歷 攝像頭
3. 通訊錄
4. 地理位置
5. 麥克風
6. 電話
7. 短信
8. 存儲空間
運行時權限處理
PS:targetSdkVersion小於23的應用默認授予了所申請的所有權限,所以如果你以前的APP設置的targetSdkVersion低於23,也能正常使用。等於或者大於23,則必須 request permission,否則會崩潰閃退。
我們需要在build.gradle中聲明targetSdkVersion為23.
android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.youapp" minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" }
我們需要在用到權限的地方,檢查是否已經擁有權限,比如讀寫外置SD卡的權限,我們在寫入之前檢查是否有權限,沒有則申請權限,for exsample:
private void requestContactPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) { //申請 WRITE_CONTACTS 權限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_WRITE_CONTACTS); } }
權限申請後,用戶選擇後,可能allow,可能deny。回調onRequestPermissionsResult方法, 該方法類似於onActivityResult。如果是fragment,最好是使用父fragment,但不是使用ActivityCompat。建議使用getParentFragment().requestPermissions方法。
兼容庫support-v4中的方法有:
ContextCompat.checkSelfPermission()
ActivityCompat.requestPermissions()
ActivityCompat.OnRequestPermissionsResultCallback
ActivityCompat.shouldShowRequestPermissionRationale()
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); handleGrantResults(requestCode,grantResults); }
private void handleGrantResults(int requestCode, int[] grantResults) { if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission Granted 獲得權限後執行xxx } else { // Permission Denied 拒絕後xx的操作。 } } }
如果用戶拒絕了一次,後面再申請,會出現不再提醒的選項,再次拒絕,你的app不作後續處理,就嗝屁了。功能肯定受限,沒法用了。 這時候怎麼辦呢?用戶的行為我們不清楚,得預防一下。
我們檢測下是否拒絕了兩次或以上,DIY給個提示。比如申請寫聯系人的權限。
private void handleContactPermission() { if (Integer.parseInt(Build.VERSION.SDK)>=23) { int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS); if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) { showMessageOKCancel("You need to allow access to Contacts", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestContactPermission();//確定後申請權限。 } }); return; } requestContactPermission();//沒有權限的話,申請。 } }
github已經有一些封裝好的permissionUtil,大家可以下載學習。不足之處,後續完善。
一、 進程概念介紹四大組件都是運行在主線程Service是在一段不定的時間運行在後台,不和用戶交互應用組件。每個Service必須在manifest中 通過來聲明。可以通
1.修改SDK版本: 打開File--Project Structure... Modules--app--Properties
RecyclerView 是 android-support-v7-21 版本中新增的一個 Widgets。我們可以使用RecyclerView非常簡單的實現橫向豎向的L
Gson 是 Google 官方提供的用來在 Java 對象和 JSON 之間進行互相轉換的Java類庫。我之前在使用Eclipse開發Android的時候,並沒有經常使