項目中處理android 6.0權限管理問題


android 6.0對於權限管理比較收緊,因此在適配android 6.0的時候就很有必要考慮一些權限管理的問題。

如果你沒適配6.0的設備並且權限沒給的話,就會出現類似如下的問題:

java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{b83b87a 16850:com.chexiu.sales/u0a34} (pid=16850, uid=10034) with revoked permission android.permission.CALL_PHONE

google官方權限分類:

如下為正常的權限:

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

如下為危險權限:

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

那么問題來了,因為這些危險權限導致app在6.0上面崩潰就不應該,所以要找好的方法來解決問題:

庫的地址:https://github.com/mylhyl/AndroidAcp

項目中的集成和使用:

1,gradle集成:

compile 'com.mylhyl:acp:1.1.5'

2,代碼集成進來,方便修改

我采用2的方式

然后看下實際項目中的使用:

比如針對撥打電話權限的6.0適配:

  /**
     * 直接撥打電話
     */
    public static boolean intentToCall(final Context context, final String phoneNumber) {
        if (context == null || StringUtil.isEmpty(phoneNumber)) {
            return false;
        }
        //6.0權限處理 Acp.getInstance(context).request(new AcpOptions.Builder().setPermissions( Manifest.permission.CALL_PHONE).build(), new AcpListener() { @Override public void onGranted() { Uri u = Uri.parse("tel:" + phoneNumber); Intent it = new Intent(Intent.ACTION_CALL, u); context.startActivity(it); } @Override public void onDenied(List<String> permissions) { } }); return true;
    }

鏈式調用,提供授權和授權失敗兩種情況處理

如果提供權限會調用onGranted(){}方法,你只需要在里面添加授權后的操作就行。

如果授權失敗會調用onDenied(){}方法,你可以提醒用戶授權失敗,並進行后續操作。

並且該庫具有如下特點:

  • 支持批量權限申請,不需要重寫 onRequestPermissionsResult 方法,Activity 與 Fragment 中用法一致,一句話搞定。
  • 處理權限拒絕,或勾選不再詢問,導致不能正常使用功能的提示框,支持跳轉設置權限界面開啟權限,所有提示框文字可自定義。
  • 兼容小米跳轉權限設置
  • 增加M版本檢測

當然建議代碼集成到項目中來,后期萬一修改也比較方便。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM