App更新8.0適配出現的問題
問題1 android.os.FileUriExposedException
這個應該是7.0就應該處理的。新的許可權機制
解決辦法就是在AndroidManifest中配置
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
然後在res建立對應的xml寫入paths
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external_files"
path="."/>
</paths>
拉起安裝apk的時候變為
val uri: Uri
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(App.mInstance, App.mInstance.applicationContext.packageName + ".provider", apkFile)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
else {
uri = Uri.fromFile(apkFile)
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.setDataAndType(uri, "application/vnd.android.package-archive")
startActivity(intent)
但是這樣還是有可能會出現問題,比如當我們第三方庫中有類似的配置可能就會出現錯誤,編譯不通過
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugManifest'.
通過gradlew processDebugManifest --stacktrace檢視具體的日誌
Attribute provider#android.support.v4.content.FileProvider@authorities value=(com.xpand.work.provider) from AndroidManifest.xml:110:13-58
is also present at [com.jph.takephoto:takephoto_library:4.0.3] AndroidManifest.xml:19:13-64 value=(com.xpand.work.fileprovider).
Suggestion: add 'tools:replace="android:authorities"' to <provider> element at AndroidManifest.xml:107:9-117:20 to override.
屬性衝突了。以前經常遇到過的。
通過建議設定修改為這樣就ok了
<provider
tools:replace="android:authorities"
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
tools:replace="android:resource"
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
重要更新
經過上面的程式碼我以為已經解決了問題,下載更新功能確實已經可用,但是又出現了新的問題。
測試的時候發現app拍照會出問題,takePhoto庫的拍照取不到照片路徑了。於是找了各種方案最後還是下面的文章助我解決了這個問題
參考 https://www.jianshu.com/p/88a3f8608d6f
android:name=".view.custom.MyProvider"
android:authorities="${applicationId}.app.provider"
android:exported="false"
tools:replace="name,authorities,exported,grantUriPermissions"
android:grantUriPermissions="true">
<meta-data
tools:replace="name,resource"
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/app_file_paths"/>
</provider>
問題2 通知欄適配
按照以前低版本的寫法不能彈出通知欄下載進度條,因為8.0的通知變化構建
Builder的時候單context引數方法已被廢棄
/**
* @deprecated use
* {@link NotificationCompat.Builder#NotificationCompat.Builder(Context, String)} instead.
* All posted Notifications must specify a NotificationChannel Id.
*/
public Builder(Context context) {
this(context, null);
}
提示我們呼叫帶channelid的構造方法進行初始化。需要channelId
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChanel()
}
@RequiresApi(Build.VERSION_CODES.O)
private fun createChanel() {
val channel = NotificationChannel(CHANNELID, "process", NotificationManager.IMPORTANCE_HIGH)
mBuilder!!.setDefaults(NotificationCompat.FLAG_ONLY_ALERT_ONCE)
mNotifyManager!!.createNotificationChannel(channel)
}
問題3 不能彈出安裝頁面
8.0需要許可權
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
才能彈出
“處於安全考慮,已禁止您的手機安裝來自此來源的未知應用”
這段提示語,然後使用者自己去設定開啟允許安裝此來源的應用,就可以安裝了。
倒是不像網上說的還要像適配6.0的敏感許可權一樣去申請呢。
問題4 取消通知欄震動
下載apk檔案的時候一直震動,想要關閉,網上很多部落格說設定channel的這個屬性
channel.enableVibration(false)
channel.vibrationPattern= longArrayOf(0)
但是在響鈴模式會有聲音一直響,所以乾脆設定
mBuilder!!.setOnlyAlertOnce(true)
只會提示一次不會煩人的一直響,還挺省事
相關文章
- Android app 線上更新那點事兒(適配Android6.0、7.0、8.0)AndroidAPP
- 行者APP適配國外環境問題解決APP
- MySQL8.0 view導致的效能問題MySqlView
- castor jdo 的更新問題AST
- Servlet Cookie更新的問題ServletCookie
- mac 更新問題Mac
- 聊聊springboot自動裝配出現的TypeNotPresentExceptionProxy異常排查Spring BootException
- AppScan 8.0APP
- 移動APP測試-Android螢幕適配問題(一)APPAndroid
- 移動APP測試:Android螢幕適配問題二APPAndroid
- 解決Redmine建立&更新問題時很慢的問題
- uniapp實現熱更新APP
- mysql8.0插入慢的問題解決方案(一)MySql
- MySQL8.0的caching_sha2_password問題MySql
- iOS11適配遇到的問題iOS
- android螢幕適配的問題Android
- Android app自動更新總結(已適配9.0)AndroidAPP
- Android 6.0、7.0、8.0、9.0適配Android
- Android 8.0 自適應圖示Android
- MySQL 8.0新特性更新介紹MySql
- Apple推出適用於macOS的Safari 14作為獨立更新APPMac
- go熱更新問題求助Go
- mysql8.0 部分sql語法報錯問題MySql
- Android懸浮框的適配問題Android
- MD5加密的密碼資訊回顯更新問題,Mybatis-plus動態更新問題以及更新策略加密密碼MyBatis
- nginx DNS 解析快取的更新問題NginxDNS快取
- 更新swift4所遇到的問題Swift
- oracle觸發器~ 更新多表的問題Oracle觸發器
- 關於Partition列被更新的問題
- sun的application server的問題APPServer
- 解決app中多語音出現的衝突問題APP
- 適用於macOS的Disk Drill更新了本地Apple Silicon Macs支援MacAPP
- Laravel 訪問器 $appends 忽略的問題LaravelAPP
- [iOS]適配iOS10問題iOS
- 問題定位 | XtraBackup 8.0 資料重建避坑事件始末事件
- AndroidN7.0、8.0上自動安裝apk問題AndroidAPK
- Flutter 問題集,持續更新Flutter
- GoldenGate更新丟失問題Go