Android 6.0新特性
android的權限系統一直是首要的安全概念,因為這些權限只在安裝的時候被詢問一次。一旦安裝了,app可以在用戶毫不知曉的情況下訪問權限內的所有東西。
難怪一些壞蛋利用這個缺陷惡意收集用戶數據用來做壞事了!
android小組也知道這事兒。7年了!權限系統終于被重新設計了。在android6.0棉花糖,app將不會在安裝的時候授予權限。取而代之的是,app不得不在運行時一個一個詢問用戶授予權限。
注意權限詢問對話框不會自己彈出來。開發者不得不自己調用。如果開發者要調用的一些函數需要某權限而用戶又拒絕授權的話,函數將拋出異常直接導致程序崩潰。
另外,用戶也可以隨時在設置里取消已經授權的權限。
已經發布了的app會發生什么
新運行時權限可能已經讓你開始恐慌了。“hey,伙計!我三年前發布的app可咋整呢。如果他被裝到android 6.0上,我的app會崩潰嗎?!?”
莫慌張,放輕松。android小隊又不傻,肯定考慮到了這情況。如果app的targetSdkVersion 低于 23,那將被認為app沒有用23新權限測試過,那將被繼續使用舊有規則:用戶在安裝的時候不得不接受所有權限,安裝后app就有了那些權限咯!
別高興的太早。盡管app不會調用這個函數時崩潰,返回值null或者0可能接下來依然導致崩潰。
好消息(至少目前看來)是這類取消權限的情況比較少,我相信很少用戶這么搞。如果他們這么辦了,后果自負咯。
但從長遠看來,我相信還是會有大量用戶會關閉一些權限。我們app不能再新設備完美運行這是不可接受的。
怎樣讓他完美運行呢,你最好修改代碼支持最新的權限系統,而且我建議你立刻著手搞起!
代碼沒有成功改為支持最新運行時權限的app,不要設置targetSdkVersion 23 發布,否則你就有麻煩了。只有當你測試過了,再改為targetSdkVersion 23 。
警告:現在你在android studio新建項目,targetSdkVersion 會自動設置為 23。如果你還沒支持新運行時權限,我建議你首先把targetSdkVersion 降級到22
PROTECTION_NORMAL類權限
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
讓你的app支持新運行時權限
是時候讓我們的app支持新權限模型了,從設置compileSdkVersion andtargetSdkVersion 為 23開始吧.
android {
compileSdkVersion 23
...
defaultConfig {
...
targetSdkVersion 23
...
}
例子,我想用一下方法添加聯系人。
private static final String TAG =
"Contacts"
;
private void insertDummyContact() {
// Two operations are needed to insert a new contact.
ArrayList<ContentProviderOperation> operations =
new
ArrayList<ContentProviderOperation>(2);
// First, set up a new raw contact.
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,
null
)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME,
null
);
operations.add(op.build());
// Next, set the name for the contact.
op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
"__DUMMY CONTACT from runtime permissions sample"
);
operations.add(op.build());
// Apply the operations.
ContentResolver resolver = getContentResolver();
try
{
resolver.applyBatch(ContactsContract.AUTHORITY, operations);
}
catch
(RemoteException e) {
Log.d(TAG,
"Could not add a new contact: "
+ e.getMessage());
}
catch
(OperationApplicationException e) {
Log.d(TAG,
"Could not add a new contact: "
+ e.getMessage());
}
}
上面代碼需要WRITE_CONTACTS權限。如果不詢問授權,app就崩了。
下一步像以前一樣在AndroidManifest.xml添加聲明權限。
<uses-permission android:name=
"android.permission.WRITE_CONTACTS"
/>
全新的Android M相比目前的Android Lollipop(5.0)有六項重大的改進:
1.App Permissions(軟件權限管理):在Android M里,應用許可提示可以自定義了。它允許對應用的權限進行高度管理,比如應用能否使用位置、相機、麥克風、通訊錄等,這些都可以開放給開發者和用戶。
2.Chrome Custom Tabs(網頁體驗提升):新版的M對于Chrome的網頁瀏覽體驗進行了提升,它對登陸網站、存儲密碼、自動補全資料、多線程瀏覽網頁的安全性進行了一些列的優化。
3.App Links(APP關聯):Android M加強了軟件間的關聯,谷歌在現場展示了 一個例子,比如你的手機郵箱里收到一封郵件,內文里有以個推ter鏈接,用戶點擊該鏈接可以直接跳轉到推ter應用,而不再是網頁。
4.Android Pay(安卓支付):終于來了!Android支付統一標準。新的M系統中集成了Android Pay。其特性在于簡潔、安全、可選性。Android Pay是一個開放性平臺,使用戶就可以選擇谷歌的服務或者使用銀行的APP來使用它,Android Pay支持4.4以后系統設備,在發布會上谷歌宣布Android Pay已經與美國三大運營商700多家商店達成合作。支付功能可以使用指紋來進行支付,這意味著今年基于安卓M的Nexus產品肯定會有指紋識別了。
5.Fingerprint Support(指紋支持):Android M增加了對指紋的識別API,谷歌開始在M里自建官方的指紋識別支持,力求Android統一方案,目前所有的Android產品指紋識別都是使用非谷歌認證的技術和接口。
6.Power & Change(電量管理 ):新的電源管理模塊將更為智能,比如Android平板長時間不移動時,M系統將自動關閉一些App。同時Android M設備將支持USB Type-C接口,新的電源管理將更好的支持Type-C接口。Android 6.0 引入“Doze”模式,手機會在一段時間未檢測到移動時,讓應用休眠,當屏幕處于關閉狀態,平均續航時間長30%。
在之前,安卓系統雖然可以支持TF卡擴展,但TF卡擴展的容量只能當成外置存儲。雖然用戶可以把照片、音樂等內容放進去,但App不能安裝到其中。在安卓6.0中,當首次插入TF卡的時候,系統會詢問會將TF卡作為外置還是內置儲存。如果選擇作為內置存儲,系統則會對TF卡格式化并加密——注意,這會丟失數據!然后,TF卡的容量就和設備的內置存儲融合了。
一般來說,設備的內置存儲速度會比TF卡快上不少,穩定性也更高,因此如果不是容量特別緊張,并不建議把TF當成內置儲存植入。同時,市面上支持TF卡擴展的安卓設備也越來越少,安卓6.0的這個新特性也許會遭到冷遇。