6.0 Marshmallow 23
6.0 動態(tài)申請權限
private void checkAppPermission() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)//
{
//偽代碼
/*ArrayList permissons =new ArrayList();
permissons.add(Manifest.permission.RECORD_AUDIO);
permissons.add(Manifest.permission.READ_EXTERNAL_STORAGE);
permissons.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
permissons.add(Manifest.permission.CAMERA);*/
//通過ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED判斷相關權限是否允許
//若尚未允許則ActivityCompat.requestPermissions(activity, permissions.toArray(new String[permissions.size()]), permissionRequestCode);
//int requestCode=0x00000001;
}
}
6.0 位置權限
Android6.0之后,Wifi的使用更加嚴格簿寂。需要動態(tài)獲取LOCATION權限,如果還想獲取Wifi列表的話還需要打開GPS(位置信息)谈飒。
藍牙掃描也需要位置權限猾昆。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
7.0 Nougat 24-25
7.0 應用間共享文件
https://blog.csdn.net/lmj623565791/article/details/72859156
對于面向 Android 7.0 的應用,Android 框架執(zhí)行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI胶背。如果一項包含文件 URI 的 intent 離開您的應用巷嚣,則應用出現(xiàn)故障,并出現(xiàn) FileUriExposedException 異常钳吟。
同樣的廷粒,官網(wǎng)也給出了解決方案:
要在應用間共享文件,您應發(fā)送一項 content:// URI,并授予 URI 臨時訪問權限坝茎。進行此授權的最簡單方式是使用 FileProvider 類涤姊。如需了解有關權限和共享文件的詳細信息,請參閱共享文件嗤放。
去AndroidManifest.xml聲明provider思喊,provider里邊有meta-data屬性,里邊需要指向設有子節(jié)點一個xml文件。
核心代碼FileProvider.getUriForFile(this, "com.zhy.android7.fileprovider", file);
7.0 PopupWindow位置不正確
代碼來源:https://blog.csdn.net/qq_17766199/article/details/77404712
if (Build.VERSION.SDK_INT >= 24) { // Android 7.x中,PopupWindow高度為match_parent時,會出現(xiàn)兼容性問題,需要處理兼容性
int[] location = new int[2]; // 記錄anchor在屏幕中的位置
anchor.getLocationOnScreen(location);
int offsetY = location[1] + anchor.getHeight();
if (Build.VERSION.SDK_INT >= 25) { // Android 7.1 ,8.0中次酌,PopupWindow高度為 match_parent 時恨课,會占據(jù)整個屏幕
// 故而需要在 Android 7.1上再做特殊處理
int screenHeight = ScreenUtils.getScreenHeight(context); // 獲取屏幕高度
popupWindow.setHeight(screenHeight - offsetY); // 重新設置 PopupWindow 的高度
}
popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY);
} else {
popupWindow.showAsDropDown(anchor);
}
7.0 三個廣播被禁止監(jiān)聽或發(fā)送
在后臺時不再能接收到 CONNECTIVITY_CHANGE 廣播,前臺不影響岳服。
不能發(fā)送或是接收新增圖片(ACTION_NEW_PICTURE)和新增視頻(ACTION_NEW_VIDEO) 的廣播剂公。
8.0 Oreo 26-27
8.0 安裝apk
安卓8.0去除了“允許未知來源”選項,如果apk里邊有安裝apk的功能(如應用更新)吊宋,需用canRequestPackageInstalls()
查詢是否有此權限纲辽,沒有的話用Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES
這個action引導用戶到安裝未知來源應用界面去授權。
代碼示例來源:https://blog.csdn.net/qq_17766199/article/details/80965631
private static final int REQUEST_CODE_UNKNOWN_APP = 100;
private void installAPK(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
if (hasInstallPermission) {
//安裝應用
} else {
//跳轉至“安裝未知應用”權限界面璃搜,引導用戶開啟權限
Uri selfPackageUri = Uri.parse("package:" + this.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri);
startActivityForResult(intent, REQUEST_CODE_UNKNOWN_APP);
}
}else {
//安裝應用
}
}
//接收“安裝未知應用”權限的開啟結果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_UNKNOWN_APP) {
installAPK();
}
}
8.0廣播
靜態(tài)注冊廣播 - 在AndroidManifest.xml中設置拖吼,程序不用啟動亦可接收。 典型代表:很多開機啟動的APP这吻,都是接收開機啟動廣播帶起服務的绿贞。
動態(tài)注冊廣播 - 代碼中注冊廣播,程序未啟動時橘原,無法接收廣播籍铁。 、
典型代表:Go短信趾断,將Go短信強行停止拒名,Go短信無法接收短信。
靜態(tài)廣播無法清單注冊芋酌,動態(tài)的可以增显。
Google官方聲明:從android 8.0(API26)開始,對清單文件中靜態(tài)注冊廣播接收者增加了限制脐帝,建議大家不要在清單文件中靜態(tài)注冊廣播接收者同云,改為動態(tài)注冊。當然堵腹,如果你還是想用靜態(tài)注冊的方式也是有方法的炸站,Intent里添加Component參數(shù)可實現(xiàn)。
8.0通知權限Notification
Android 8.0之后通知權限默認都是關閉的疚顷,無法默認開啟以及通過程序去主動開啟旱易,需要程序員讀取權限開啟情況禁偎,然后提示用戶去開啟。
代碼來源:https://blog.csdn.net/yinhaide/article/details/103295050
/**
* 判斷通知權限是否開啟
* @param context 上下文
*/
public static boolean isNotificationEnabled(Context context){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE)).areNotificationsEnabled();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.uid;
try {
Class<?> appOpsClass = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod = appOpsClass.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE, String.class);
Field opPostNotificationValue = appOpsClass.getDeclaredField("OP_POST_NOTIFICATION");
int value = (Integer) opPostNotificationValue.get(Integer.class);
return (Integer) checkOpNoThrowMethod.invoke(appOps, value, uid, pkg) == 0;
} catch (NoSuchMethodException | NoSuchFieldException | InvocationTargetException | IllegalAccessException | RuntimeException | ClassNotFoundException ignored) {
return true;
}
} else {
return true;
}
}
//前往設置開啟權限
/**
* 打開設置頁面打開權限
*
* @param activity activity
* @param requestCode 這里的requestCode和onActivityResult中requestCode要一致
*/
public static void startSettingActivity(@NonNull Activity activity, int requestCode) {
try {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + activity.getPackageName()));
intent.addCategory(Intent.CATEGORY_DEFAULT);
activity.startActivityForResult(intent, requestCode);
} catch (Exception e) {
e.printStackTrace();
}
}
————————————————
版權聲明:本文為CSDN博主「尹海德」的原創(chuàng)文章阀坏,遵循CC 4.0 BY-SA版權協(xié)議如暖,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yinhaide/article/details/103295050
9.0 Pie 28
自 Android 6 發(fā)布,就移除了對 Apache HTTP 客戶端的支持忌堂,而推薦改用 HttpURLConnection 類,因為它可以通過透明壓縮和響應緩存減少網(wǎng)絡使用盒至,并可最大限度降低耗電量
10.0 Q 29
最大的變化是用戶隱私權
10.0 存儲權限
Android Q 在外部存儲設備中為每個應用提供了一個“隔離存儲沙盒”(例如 /sdcard)。任何其他應用都無法直接訪問您應用的沙盒文件士修。由于文件是您應用的私有文件枷遂,因此您不再需要任何權限即可在外部存儲設備中訪問和保存自己的文件。此變更可讓您更輕松地保證用戶文件的隱私性李命,并有助于減少應用所需的權限數(shù)量登淘。
·訪問自己程序的文件箫老,不需要請求權限封字,取消了READ_EXTERNAL_STORAGE
和 WRITE_EXTERNAL_STORAGE
權限
·訪問沙盒外的媒體共享文件,需申請新的媒體權限耍鬓,READ_MEDIA_IMAGES
阔籽,READ_MEDIA_AUDIO
和READ_MEDIA_IMAGES
。
·