檢查問題的時候也看了一下bugly的接入指南,加入了android7.0的適配。開始覺得7.0的使用者還少而且我的編譯版本是5.0就沒做適配。當最近更新反應更新失敗的使用者比較多時就仔細查了一下問題。也看了一下鵝廠工程師的部落格(
)。原來這是由於android7.0執行了「strictmode api 政策禁」的原因。" strictmode api 政策" 是指禁止向你的應用外公開 file:// uri。 如果一項包含檔案 file:// uri型別 的 intent 離開你的應用,應用失敗,並出現 fileuriexposedexception 異常。
以前更新通過隱式呼叫系統安裝程式1 23
4intent i =
new
intent(intent.action_view);
i.setdataandtype(uri.fromfile(file),
);
i.addflags(intent.flag_activity_new_task);
context.startactivity(i);
這段**是通過intent設定資料和型別,然後通過context在新的task中啟動安裝apk的程式。
我們看到intent設定資料時,傳遞的是乙個uri,這個在api<24是沒有問題的,但在android n已經禁止你對外公開file://uri.所以我們sdk的問題就出自uri.fromfile(file)獲取uri的時候。
android n已經給出明確解決方案,如果你的程式需要在應用間共享檔案,您應傳送一項 content://uri,並授予 uri 臨時訪問許可權。進行此授權的最簡單方式是使用 fileprovider類。
首先在androidmanifest中註冊fileprovider
**示例:1 23
4567
89
<
provider
android:name
=
"android.support.v4.content.fileprovider"
android:authorities
=
"com.bugly.upgrade.demo.fileprovider"
android:exported
=
"false"
android:granturipermissions
=
"true"
>
<
meta-data
android:name
=
"android.support.file_provider_paths"
android:resource
=
"@xml/provider_paths"
/>
這裡要注意一下,fileprovider是support-v4包裡面的,所以在你的程式必須要引入support-v4包。
我們可以看到在provider中需要配置相應的meta-data,這個是共享檔案的路徑,在res目錄下新建xml資料夾並新建對應的xml檔案(如下面的provider_paths),如下所示:1 23
4567
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
paths
xmlns:android
=
""
>
<
external-path
name
=
"beta_external_apk"
path
=
"download/"
/>
<
external-path
name
=
"beta_external_apk2"
path
=
"android/data//"
/>
由於手裡沒有7.0的裝置在優測上租個裝置(還好有乙個小時的試用)測試了一下,完美解決。谷歌系統公升級竟然不向下相容,這也是個坑。
Android 應用公升級
獲取版本 public void setversions context context catch packagemanager.namenotfoundexception n public void shownoticedialog context context setnegativebutt...
Android系統應用手動安裝公升級版重啟還原問題
1 系統應用能否被公升級的問題?系統應用主要分為兩類,b 定製手機的自帶應用,主要是運營商和廠商合作的定製手機,參考物件華為的電信定製手機內建了很多電信的應用以及qq uc瀏覽器的應用等,這類應用剛開始是不能被解除安裝的,但是 可以通過第三方應用市場公升級應用,公升級後的應用重啟不消失但可以被解除安...
Android應用程式更新或公升級
1 android系統應用更新機制 系統為每個應用在androidmainfest.xml提供了versionname versioncode兩個屬性。versionname string型別,用來給應用的使用者來檢視版本,代表應用程式的版本資訊,需要顯示給使用者。與versioncode一樣,系統...