應用公升級不能安裝(Android7 0的新變化)

2021-07-29 19:21:44 字數 2847 閱讀 9776

檢查問題的時候也看了一下bugly的接入指南,加入了android7.0的適配。開始覺得7.0的使用者還少而且我的編譯版本是5.0就沒做適配。當最近更新反應更新失敗的使用者比較多時就仔細查了一下問題。也看了一下鵝廠工程師的部落格(

)。原來這是由於android7.0執行了「strictmode api 政策禁」的原因。" strictmode api 政策" 是指禁止向你的應用外公開 file:// uri。 如果一項包含檔案 file:// uri型別 的 intent 離開你的應用,應用失敗,並出現 fileuriexposedexception 異常。

以前更新通過隱式呼叫系統安裝程式1 23

4intent i =newintent(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

<?xmlversion="1.0"encoding="utf-8"?>

<pathsxmlns:android="">

<external-pathname="beta_external_apk"path="download/"/>

<external-pathname="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一樣,系統...