Android Q、つまり API 29 では、PendingIntent を使用して通知をクリックしてもジャンプできないという問題が発生することがありますが、長時間検索しても問題が見つかりません。アプリは Android Q と互換性を持つように自動的に更新されます。ダウンロードしてインストールした後、アプリがフォアグラウンドにあるときは問題ありませんが、バックグラウンドにあるときは問題が発生します。これは、Google が Android Q でのバックグラウンド起動アクティビティを禁止しているためです。したがって、gradleで設定すると、次のようになります。
targetSdkVersion 29
次に、アプリがバックグラウンドにあるときはシステム インストーラーを開始できないように見えるため、情報を調べた後、誰かが次のように書くように指示します: インストーラーを開始するには、アプリは Android Q と互換性があります 互換性のあるコード
:
public static void installApk(Context mContext, File apkFile) {
if (!apkFile.exists()) {
return;
}
Intent i = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
Uri apkFileUri = FileProvider.getUriForFile(mContext,
mContext.getPackageName() + ".fileprovider", apkFile);
i.setDataAndType(apkFileUri, "application/vnd.android.package-archive");
mContext.startActivity(i);
} else {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + apkFile.toString()),
"application/vnd.android.package-archive");
mContext.startActivity(i);
}
}
まず、このようにフォアグラウンドインストールを書くのは問題ないが、バックグラウンドインストールでは問題があることがわかります。その後、通知をクリックしてインストーラーを起動する方法を使用して、Android Qと互換性のあるものにします。バックグラウンドでアクティビティを開始します。
/**
* Created by 方舟 on 2017/10/13.
* 更新通知
*/
public class UpdateNotificationUtil extends ContextWrapper {
private Context mContext;
private static NotificationManager mManager;
private NotificationCompat.Builder mBuilder;
private static UpdateNotificationUtil updateNotificationUtil;
public static UpdateNotificationUtil getInstance() {
if (updateNotificationUtil != null && mManager != null) {
return updateNotificationUtil;
}
synchronized (ApplicationHelper.getInstance()) {
if (updateNotificationUtil == null || mManager == null) {
updateNotificationUtil = new UpdateNotificationUtil(ApplicationHelper.getInstance());
}
}
return updateNotificationUtil;
}
private UpdateNotificationUtil(Context context) {
super(context);
this.mContext = context;
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
@RequiresApi(api = Build.VERSION_CODES.O)
public void createNotificationChannel() {
NotificationChannel channel = new NotificationChannel(ConstantsHelper.NOTIFY_CHANNEL_ID,
ConstantsHelper.NOTIFY_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
mManager.createNotificationChannel(channel);
}
public void sendNotificationFullScreen(String title, String content, File apkFile) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannel();
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
Uri apkFileUri = FileProvider.getUriForFile(ApplicationHelper.getInstance(),
ApplicationHelper.getInstance().getPackageName() + ".fileprovider", apkFile);
i.setDataAndType(apkFileUri, "application/vnd.android.package-archive");
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(ApplicationHelper.getInstance(),
1, i, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, ConstantsHelper.NOTIFY_CHANNEL_ID)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setTicker(content)
.setContentText(content)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setCategory(Notification.CATEGORY_CALL)
.setFullScreenIntent(fullScreenPendingIntent, true);
Notification notification = notificationBuilder.build();
mManager.notify(1, notification);
}
}
public void clearAllNotification() {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager != null) {
notificationManager.cancelAll();
}
}
}
アプリのフォアグラウンドにすでに通知がある場合、それ以上の通知は送信されないため、通知を作成する前に通知をクリアする必要があります
UpdateNotificationUtil notificationUtils = UpdateNotificationUtil.getInstance();
notificationUtils.clearAllNotification();
notificationUtils.sendNotificationFullScreen("新版本已下载完成", "点击安装", apkFile);
mContext.startActivity(i);
最適化された installApk メソッド:
public static void installApk(Context mContext, File apkFile) {
if (!apkFile.exists()) {
return;
}
Intent i = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
Uri apkFileUri = FileProvider.getUriForFile(mContext,
mContext.getPackageName() + ".fileprovider", apkFile);
i.setDataAndType(apkFileUri, "application/vnd.android.package-archive");
UpdateNotificationUtil notificationUtils = UpdateNotificationUtil.getInstance();
notificationUtils.clearAllNotification();
notificationUtils.sendNotificationFullScreen("新版本已下载完成", "点击安装", apkFile);
mContext.startActivity(i);
} else {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + apkFile.toString()),
"application/vnd.android.package-archive");
mContext.startActivity(i);
}
}
インターネットでは、このようなことを書くと終わりだと教えられます。!!
いいえ!いいえ!いいえ!この場合、Huawei、oppo、vivo の一部のモデルでは、通知バーをクリックしてもインストール プログラムが開始されず、クリックしても反応しません。
全画面通知権限を追加する必要があります
//AndroidManifest 声明新权限,不用动态申请
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT"/>
それでおしまい!