應用程式內安裝apk沒有完成頁面或者有完成頁面點選開啟無反應
先來一個出問題的工廠方法
public class Installer { public static void install(Context context, String filePath) { File apkFile = new File(filePath); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); String authority = MrDeviceIdUtil.getPackageName(context) + ".fileprovider"; Uri contentUri = FileProvider.getUriForFile(context, authority, apkFile); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); } context.startActivity(intent); } }
方法相容了7.0的安裝。但是下載完成點選安裝之後,一些手機沒有完成頁面,一些手機有完成頁面但是點選開啟沒有反應。
仔細想了一下,問題應該是intent的身上。果不其然,intent的標誌位寫成了setFlags,造成只有一個標誌位存在。
這裡總結一下setFlags和addFlags的區別:
兩個方法的區別是setflags是直接給intent設定新的flag,清除原有的flag,addflag是在已有flag上新增新的flag。
標誌位用的是二進位制數,每一位為1代表著一個標誌,例如1,10,100,1000分別代表著不一樣的標誌(其值分別是1,2,4,8)。以下是stackoverflow上的回答,很簡單易懂:
// value of flags: 1 intent.setFlags(2|4); // now flags have this value: 110 intent.addFlags(8); // now flags have this value: 1110
so,改正一下程式碼
public class Installer { public static void install(Context context, String filePath) { File apkFile = new File(filePath); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); String authority = MrDeviceIdUtil.getPackageName(context) + ".fileprovider"; Uri contentUri = FileProvider.getUriForFile(context, authority, apkFile); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); } context.startActivity(intent); } }