Android 6.0-9.0適配

Android 6.0適配

  • 在6.0之前丈咐,在應(yīng)用安裝的時候,提示用戶所需要用到的權(quán)限列表龙宏,同意之后安裝棵逊,該app就被賦予所有的權(quán)限,我們暫且稱它為安裝時權(quán)限银酗,安裝后辆影,被賦予的權(quán)限也無法取消;在6.0之后黍特,google對權(quán)限進行了運行時的管理蛙讥,而不是在安裝時候,危險權(quán)限需要在運行時申請灭衷,我們暫且稱它為運行時權(quán)限次慢,非危險權(quán)限,在安裝時由用戶授予,這樣簡化了應(yīng)用安裝過程迫像,因為用戶在安裝或更新應(yīng)用時不需要授予權(quán)限拭抬,也給予了用戶對app功能更多的控制

  • 系統(tǒng)權(quán)限主要分為兩類,正常權(quán)限和危險權(quán)限

    正常權(quán)限不會直接危及用戶的隱私侵蒙,如果你的應(yīng)用在它的Manifest中列出了正常權(quán)限造虎,系統(tǒng)會自動授予權(quán)限
    危險權(quán)限可以讓app訪問用戶的機密數(shù)據(jù),如果你的應(yīng)用在它的Manifest列出了危險權(quán)限纷闺,用戶必須明確批準你的app使用該權(quán)限

  • 當然算凿,不管哪個版本的android,你應(yīng)用中所用到的所有權(quán)限犁功,不管是正常權(quán)限還是危險權(quán)限氓轰,都需要在應(yīng)用的Manifest中申明
    如果你的設(shè)備運行Android 5.1以及5.1以下版本,或者你的應(yīng)用的目標SDK是22以及22以下版本:如果你在應(yīng)用的Manifest中申明了危險權(quán)限浸卦,用戶在安裝時必須授予權(quán)限署鸡,如果拒絕授予權(quán)限,那么系統(tǒng)就不會安裝應(yīng)用限嫌,也就是所謂的“一刀切”方式靴庆,不同意所有權(quán)限,就不能安裝應(yīng)用

  • 如果你的設(shè)備運行Android 6.0以及6.0以上版本怒医,或者你的目標SDK是23以及23以上版本:應(yīng)用必須在Manifest中羅列出所有的權(quán)限炉抒,并且在程序運行時,它必須請求用戶授予每一個危險權(quán)限稚叹,此時用戶可以授予或者拒絕每一個權(quán)限焰薄,并且應(yīng)用程序可以繼續(xù)運行有限的功能,即使用戶拒絕了權(quán)限請求

  • 注意:從Android 6.0開始(API 23)扒袖,用戶可以在任何時候塞茅,對任何應(yīng)用撤銷權(quán)限,即使app申明的目標SDK低于23

  • 在6.0所有權(quán)限都需要申請季率?
    曰:當然不是野瘦。只有屬于危險權(quán)限的才需要申請。危險權(quán)限看下表1-2

  • 那危險權(quán)限也很多啊蚀同,也要一個個申請缅刽?
    曰:當然不是。你看看下面的表蠢络,都分好組了(9組)衰猛,對于同一組內(nèi)的權(quán)限,只要有一個被同意刹孔,其他的都會被同意啡省。
    表1-2危險權(quán)限分組


    1553134417(1).jpg

    1553135023(1).jpg

Android 7.0適配

應(yīng)用間共享文件

在targetSdkVersion大于等于的24的App中娜睛,但是我們沒有去適配7.0。那么在調(diào)用安裝頁面卦睹,或修改用戶頭像操作時畦戒,就會失敗。那么就需要你去適配7.0或是將targetSdkVersion改為24以下(不推薦)结序。
Android 7.0 行為變更 通過FileProvider在應(yīng)用間共享文件這篇文章
https://blog.csdn.net/lmj623565791/article/details/72859156
Android 7.0 引入一項新的應(yīng)用簽名方案 APK Signature Scheme v2障斋,它能提供更快的應(yīng)用安裝時間和更多針對未授權(quán) APK 文件更改的保護。在默認情況下徐鹤,Android Studio 2.2 和 Android Plugin for Gradle 2.2 會使用 APK Signature Scheme v2 和傳統(tǒng)簽名方案來簽署您的應(yīng)用垃环。

1553138198(1).jpg

1)只勾選v1簽名就是傳統(tǒng)方案簽署,但是在7.0上不會使用V2安全的驗證方式返敬。

2)只勾選V2簽名7.0以下會顯示未安裝遂庄,7.0上則會使用了V2安全的驗證方式。

3)同時勾選V1和V2則所有版本都沒問題劲赠。

3.3 org.apache不支持問題

// build.gradle里面加上這句話
defaultConfig {
    useLibrary 'org.apache.http.legacy'
}

Android8.0的適配

安卓8.0中PHONE權(quán)限組新增兩個權(quán)限

ANSWER_PHONE_CALLS:允許您的應(yīng)用通過編程方式接聽呼入電話涛目。要在您的應(yīng)用中處理呼入電話,您可以使用 acceptRingingCall() 函數(shù)凛澎。
READ_PHONE_NUMBERS :權(quán)限允許您的應(yīng)用讀取設(shè)備中存儲的電話號碼霹肝。

通知適配
安卓8.0中,為了更好的管制通知的提醒预厌,不想一些不重要的通知打擾用戶阿迈,新增了通知渠道,用戶可以根據(jù)渠道來屏蔽一些不想要的通知.

兼容的代碼

/**
 * 安卓8轧叽。0通知的兼容類哦,
 * NotifyCompatYc   yc : 是雨辰的簡寫刊棕,謝謝哦炭晒,嘿嘿 ----高貴的子信
 */
public class NotifyCompatYc {

    public static final String QFMD_CHANNEL_ID = "com.oms.mingdeng";
    public static final String QFMD_CHANNEL_NAME = "祈福明燈";
    public static final String LJMS_DEFAULT_CHANNEL_NAME = "靈機妙算";
    public static final String LJMS_CHANNEL_ID = "com.oms.mmcnotity";
    public static final String XYS_CHANNEL_ID = "com.oms.xuyuanshu";
    public static final String XYS_CHANNEL_NAME = "許願樹";

    public static void setONotifyChannel(NotificationManager manager, NotificationCompat.Builder builder, String channeId, String channelName) {
        if (TextUtils.isEmpty(channeId)||TextUtils.isEmpty(channelName)){
            L.e("NotifyCompatYc:  ".concat("安卓8.0的通知兼容庫中 channeId 與 channelName 不能為empty"));
        }
        if (Build.VERSION.SDK_INT >= 26) {
            //第三個參數(shù)設(shè)置通知的優(yōu)先級別
            NotificationChannel channel =
                    new NotificationChannel(channeId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
            channel.canBypassDnd();//是否可以繞過請勿打擾模式
            channel.canShowBadge();//是否可以顯示icon角標
            channel.enableLights(true);//是否顯示通知閃燈
            channel.enableVibration(true);//收到小時時震動提示
            channel.setBypassDnd(true);//設(shè)置繞過免打擾
            channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_SECRET);
            channel.setLightColor(Color.RED);//設(shè)置閃光燈顏色
            channel.getAudioAttributes();//獲取設(shè)置鈴聲設(shè)置
            channel.setVibrationPattern(new long[]{100, 200, 100});//設(shè)置震動模式
            channel.shouldShowLights();//是否會閃光
            if (manager != null) {
                manager.createNotificationChannel(channel);
            }
            if (builder != null) {
                builder.setChannelId(channeId);//這個id參數(shù)要與上面channel構(gòu)建的第一個參數(shù)對應(yīng)
            }
        }
    }

    public static void setONotifyChannel(NotificationManager manager,  String channeId, String channelName) {
        setONotifyChannel(manager,null,channeId,channelName);
    }

    public static Notification getNotification(Context context, String channelId) {
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId);
        Notification notification = notificationBuilder.setOngoing(true)
                .setSmallIcon(R.drawable.ic_launcher)
                .setPriority(NotificationManager.IMPORTANCE_MIN)
                .setCategory(Notification.CATEGORY_SERVICE)
                .build();
        return notification;
    }
}
安裝APK
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

這樣系統(tǒng)會自動詢問用戶完成授權(quán)。當然你也可以先使用 canRequestPackageInstalls()查詢是否有此權(quán)限甥角,如果沒有的話使用Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES這個action將用戶引導(dǎo)至安裝未知應(yīng)用權(quán)限界面去授權(quán)网严。

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) {
            //安裝應(yīng)用
        } else {
            //跳轉(zhuǎn)至“安裝未知應(yīng)用”權(quán)限界面,引導(dǎo)用戶開啟權(quán)限
            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 {
        //安裝應(yīng)用
    }

}

//接收“安裝未知應(yīng)用”權(quán)限的開啟結(jié)果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_UNKNOWN_APP) {
        installAPK();
    }
}

SharedPreferences閃退
SharedPreferences read = getSharedPreferences(RELEASE_POOL_DATA, MODE_WORLD_READABLE);
//MODE_WORLD_READABLE :8.0以后不能使用這個獲取嗤无,會閃退震束,修改成MODE_PRIVATE
SecurityException的閃退

問題原因:項目使用了ActiveAndroid,在 8.0 或 8.1 系統(tǒng)上使用 26 或以上的版本的 SDK 時当犯,調(diào)用 ContentResolver 的 notifyChange 方法通知數(shù)據(jù)更新垢村,或者調(diào)用 ContentResolver 的 registerContentObserver 方法監(jiān)聽數(shù)據(jù)變化時,會出現(xiàn)上述異常嚎卫。

解決方案:
(1)在清單文件配置

<provider
        android:name="com.activeandroid.content.ContentProvider"
        android:authorities="com.ylmf.androidclient"
        android:enabled="true"
        android:exported="false">
</provider>

(2)去掉這個監(jiān)聽刷新的方法嘉栓,改為廣播刷新

靜態(tài)廣播無法正常接收

問題原因: Android 8.0 引入了新的廣播接收器限制,因此您應(yīng)該移除所有為隱式廣播 Intent 注冊的廣播接收器

//setNotificationUri(cursor);
//給注銷掉
/** 通知數(shù)據(jù)庫發(fā)生變化*/
private void notifyChange () {
    //mContext.getContentResolver().notifyChange(ORDER_URI, null, false);
    BroadcastController.sendChangeDataBroadCast(mContext);
}

解決方案:
使用動態(tài)廣播代替靜態(tài)廣播

Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

解決方案(1):
問題原因: Android 8.0 非全屏透明頁面不允許設(shè)置方向(8.1以上谷歌就修復(fù)去掉了這個限制)

解決方案:android:windowIsTranslucent設(shè)置為false

解決方案(2):<去掉方向的設(shè)置>


640[1].jpg

解決方案(3):
使用對話框、fragmentDialog侵佃、Popwindow的代替透明的Activity麻昼。

Android9.0的適配

CLEARTEXT communication to life.115.com not permitted by network security policy

問題原因: Android P 限制了明文流量的網(wǎng)絡(luò)請求,非加密的流量請求都會被系統(tǒng)禁止掉
解決方案:
在資源文件新建xml目錄馋辈,新建文件

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

清單文件配置:

<application
    android:networkSecurityConfig="@xml/network_security_config">
    <!--9.0加的抚芦,哦哦-->
    <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />
</application>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迈螟,隨后出現(xiàn)的幾起案子叉抡,更是在濱河造成了極大的恐慌,老刑警劉巖井联,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卜壕,死亡現(xiàn)場離奇詭異,居然都是意外死亡烙常,警方通過查閱死者的電腦和手機轴捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚕脏,“玉大人侦副,你說我怎么就攤上這事⊥毡蓿” “怎么了秦驯?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挣棕。 經(jīng)常有香客問我译隘,道長,這世上最難降的妖魔是什么洛心? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任固耘,我火速辦了婚禮,結(jié)果婚禮上词身,老公的妹妹穿的比我還像新娘厅目。我一直安慰自己,他們只是感情好法严,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布损敷。 她就那樣靜靜地躺著,像睡著了一般深啤。 火紅的嫁衣襯著肌膚如雪拗馒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天墓塌,我揣著相機與錄音瘟忱,去河邊找鬼奥额。 笑死,一個胖子當著我的面吹牛访诱,可吹牛的內(nèi)容都是我干的垫挨。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼触菜,長吁一口氣:“原來是場噩夢啊……” “哼九榔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涡相,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤哲泊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后催蝗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體切威,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年丙号,在試婚紗的時候發(fā)現(xiàn)自己被綠了先朦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡犬缨,死狀恐怖喳魏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怀薛,我是刑警寧澤刺彩,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站枝恋,受9級特大地震影響创倔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焚碌,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一三幻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呐能,春花似錦、人聲如沸抑堡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽首妖。三九已至偎漫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間有缆,已是汗流浹背象踊。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工温亲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杯矩。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓栈虚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親史隆。 傳聞我的和親對象是個殘疾皇子魂务,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容