編輯:關於Android編程
盡管Android正在被不斷開發,但Android 6.0是完全不同的,對於Android 6.0的幾個主要的變化,查看查看官網的這篇文章:
http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html
其中當然包含Runtime Permissions。
本篇文章目的就是讓開發者能輕松解決一些運行時權限的問題。
新的權限獲取方式除了要求像之前版本一樣在AndroidManifest文件中靜態申請之外,應用還需根據需要請求權限,方式采用向用戶顯示一個請求權限的對話框。這些被動態申請的權限可以在系統設置中被手動關閉。另外,對於類別為NORMAL(正常)的權限,仍然只需要在AndroidManifest文件中靜態申請,系統安裝時會直接獲取,對於Dangerous(危險)權限則需要在Java代碼中作處理。
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如下(權限組的形式):
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
注:如果你申請某個Dangerous Permissions,假設你的app早已被用戶授權了同一組的某個危險權限,那麼系統會立即授權,而不需要用戶去點擊授權。開發的時候不要對權限組有過多依賴,盡可能對每個危險權限都進行正常的權限申請。
下面我們來進行Android 6.0的適配工作:
1.Android 6.0 運行時權限處理
(1)在AndroidManifest文件中添加需要的權限(我們假設權限xx);
(2)在Java代碼中進行動態授權:
private static final int REQUEST_XX_PERMISSION=10;
/**
* 這個方法在需要進行授權的地方調用
*/
private void requestXxPermission(){
//判斷系統版本
if (Build.VERSION.SDK_INT >= 23) {
int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.xx);
//判斷這個權限是否已經授權過
if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
//判斷是否需要 向用戶解釋,為什麼要申請該權限,該方法只有在用戶在上一次已經拒絕過你的這個權限申請才會調用。
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.xx))
Toast.makeText(this,"Need xx permission.",Toast.LENGTH_SHORT).show();
/**
* 參數1 Context
* 參數2 需要申請權限的字符串數組,支持一次性申請多個權限,對話框逐一詢問
* 參數3 requestCode 主要用於回調的時候檢測
*/
ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.xx},REQUEST_BLUETOOTH_PERMISSION);
return;
}else{
}
} else {
}
}
(3)授權回調處理
@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){
switch(permsRequestCode){
case REQUEST_XX_PERMISSION:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//授權成功
} else {
//授權拒絕
}
break;
}
}
對於權限的申請結果,首先驗證requestCode定位到你的申請,然後驗證grantResults對應於申請的結果,這裡的數組對應於申請時的第二個權限字符串數組。如果你同時申請兩個權限,那麼grantResults的length就為2,分別記錄你兩個權限的申請結果。如果申請成功,就可以做你的事情了。
2.案例一 適配Android 6.0 藍牙
(1)在AndroidManifest文件中添加需要的權限;
(2)在Java代碼中進行動態授權(這裡以藍牙權限為例):
private static final int REQUEST_BLUETOOTH_PERMISSION=10;
private void requestBluetoothPermission(){
//判斷系統版本
if (Build.VERSION.SDK_INT >= 23) {
int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
//判斷這個權限是否已經授權過
if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
//判斷是否需要 向用戶解釋,為什麼要申請該權限
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION))
Toast.makeText(this,"Need bluetooth permission.",Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_BLUETOOTH_PERMISSION);
return;
}else{
}
} else {
}
}
(3)此處為簡化處理就不作授權回調處理了。
《Android圓形頭像圖Circle ImageView》需要處理的原始圖(pic): 使用CircleImageView處理後的圖(作為頭像):
仿QQ消息列表item橫向滑動刪除ListView中item側滑刪除在最近的項目中,我的ListView中item選項是長按刪除的效果(Android的通常做法長按或點擊
其實我一直准備寫一篇關於Android事件分發機制的文章,從我的第一篇博客開始,就零零散散在好多地方使用到了Android事件分發的知識。也有好多朋友問過我各種問題,比如
1.概述 Fragment是Activity中用戶界面的一個行為或者是一部分。主要是支持在大屏幕上動態和更為靈活的去組合或是交換UI組件,通過將activity的布局分