优化安装xapk,不成功
This commit is contained in:
@@ -176,4 +176,5 @@ dependencies {
|
||||
implementation 'com.github.getActivity:Toaster:12.6'
|
||||
//沉浸状态栏
|
||||
implementation 'com.gitee.zackratos:UltimateBarX:0.8.0'
|
||||
implementation 'com.github.andywu91:XAPKInstaller:1.0.0'
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_FILES" />
|
||||
|
||||
<application
|
||||
android:name=".base.BaseApplication"
|
||||
@@ -43,6 +44,10 @@
|
||||
<activity
|
||||
android:name=".activity.upload.UploadActivity"
|
||||
android:launchMode="singleTask" />
|
||||
<activity android:name=".activity.InstallActivity"
|
||||
android:enabled="true"
|
||||
android:launchMode="singleTop"
|
||||
android:exported="true"/>
|
||||
|
||||
<receiver
|
||||
android:name=".receiver.InstallResultReceiver"
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.example.mir4updater.activity;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageInstaller;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.example.mir4updater.R;
|
||||
import com.example.mir4updater.utils.XapkUtils;
|
||||
|
||||
public class InstallActivity extends AppCompatActivity {
|
||||
|
||||
private static final String TAG = "InstallActivity";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_install);
|
||||
}
|
||||
|
||||
protected void onNewIntent(Intent intent) {
|
||||
super.onNewIntent(intent);
|
||||
Log.e(TAG, "onNewIntent: ");
|
||||
Bundle extras = intent.getExtras();
|
||||
if (XapkUtils.PACKAGE_INSTALLED_ACTION.equals(intent.getAction())) {
|
||||
int status = -100;
|
||||
String message = "";
|
||||
if (extras != null) {
|
||||
status = extras.getInt(PackageInstaller.EXTRA_STATUS);
|
||||
message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE);
|
||||
}
|
||||
switch (status) {
|
||||
case PackageInstaller.STATUS_PENDING_USER_ACTION:
|
||||
// This test app isn't privileged, so the user has to confirm the install.
|
||||
Intent confirmIntent = (Intent) extras.get(Intent.EXTRA_INTENT);
|
||||
startActivity(confirmIntent);
|
||||
break;
|
||||
case PackageInstaller.STATUS_SUCCESS:
|
||||
Toast.makeText(this, "安装成功!", Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
break;
|
||||
case PackageInstaller.STATUS_FAILURE:
|
||||
case PackageInstaller.STATUS_FAILURE_ABORTED:
|
||||
case PackageInstaller.STATUS_FAILURE_BLOCKED:
|
||||
case PackageInstaller.STATUS_FAILURE_CONFLICT:
|
||||
case PackageInstaller.STATUS_FAILURE_INCOMPATIBLE:
|
||||
case PackageInstaller.STATUS_FAILURE_INVALID:
|
||||
case PackageInstaller.STATUS_FAILURE_STORAGE:
|
||||
Toast.makeText(this, "安装失败,请重试",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
Log.d(TAG, "Install failed! " + status + ", " + message);
|
||||
break;
|
||||
default:
|
||||
Toast.makeText(this, "安装失败,解压文件可能已丢失或损坏,请重试",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
Log.d(TAG, "Unrecognized status received from installer: " + status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.example.mir4updater.activity.main;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
@@ -30,6 +31,10 @@ import com.hjq.permissions.XXPermissions;
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.wuliang.lib.XapkInstaller;
|
||||
import com.wuliang.lib.XapkInstallerFactoryKt;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
@@ -115,7 +120,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
// }
|
||||
// });
|
||||
|
||||
mViewModel.patchAPK();
|
||||
// mViewModel.patchAPK();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -442,41 +447,80 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
|
||||
|
||||
private void getLocationPermission() {
|
||||
XXPermissions.with(this)
|
||||
// 申请单个权限
|
||||
.permission(PermissionUtils.Location_Permission)
|
||||
// 申请多个权限
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q){
|
||||
XXPermissions.with(this)
|
||||
// 申请单个权限
|
||||
.permission(PermissionUtils.Location_Permission)
|
||||
// 申请多个权限
|
||||
// .permission(Permission.Group.STORAGE)
|
||||
// 设置权限请求拦截器(局部设置)
|
||||
//.interceptor(new PermissionInterceptor())
|
||||
// 设置不触发错误检测机制(局部设置)
|
||||
//.unchecked()
|
||||
.request(new OnPermissionCallback() {
|
||||
@Override
|
||||
public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
|
||||
Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted);
|
||||
if (!allGranted) {
|
||||
// 设置权限请求拦截器(局部设置)
|
||||
//.interceptor(new PermissionInterceptor())
|
||||
// 设置不触发错误检测机制(局部设置)
|
||||
//.unchecked()
|
||||
.request(new OnPermissionCallback() {
|
||||
@Override
|
||||
public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
|
||||
Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted);
|
||||
if (!allGranted) {
|
||||
// Toaster.show("获取部分权限成功,但部分权限未正常授予");
|
||||
return;
|
||||
}
|
||||
Log.e(TAG, "onGranted: 获取权限成功");
|
||||
return;
|
||||
}
|
||||
Log.e(TAG, "onGranted: 获取权限成功");
|
||||
// getFile();
|
||||
// getPermssions();
|
||||
// requestDirectoryAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
|
||||
Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain);
|
||||
if (doNotAskAgain) {
|
||||
Toaster.show("被永久拒绝授权,请手动授予权限");
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(MainActivity.this, permissions);
|
||||
} else {
|
||||
Log.e(TAG, "onGranted: 获取权限失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@Override
|
||||
public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
|
||||
Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain);
|
||||
if (doNotAskAgain) {
|
||||
Toaster.show("被永久拒绝授权,请手动授予权限");
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(MainActivity.this, permissions);
|
||||
} else {
|
||||
Log.e(TAG, "onGranted: 获取权限失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
}else {
|
||||
XXPermissions.with(this)
|
||||
// 申请单个权限
|
||||
.permission(PermissionUtils.Location_Permission_old)
|
||||
// 申请多个权限
|
||||
// .permission(Permission.Group.STORAGE)
|
||||
// 设置权限请求拦截器(局部设置)
|
||||
//.interceptor(new PermissionInterceptor())
|
||||
// 设置不触发错误检测机制(局部设置)
|
||||
//.unchecked()
|
||||
.request(new OnPermissionCallback() {
|
||||
@Override
|
||||
public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
|
||||
Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted);
|
||||
if (!allGranted) {
|
||||
// Toaster.show("获取部分权限成功,但部分权限未正常授予");
|
||||
return;
|
||||
}
|
||||
Log.e(TAG, "onGranted: 获取权限成功");
|
||||
// getFile();
|
||||
// getPermssions();
|
||||
// requestDirectoryAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
|
||||
Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain);
|
||||
if (doNotAskAgain) {
|
||||
Toaster.show("被永久拒绝授权,请手动授予权限");
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(MainActivity.this, permissions);
|
||||
} else {
|
||||
Log.e(TAG, "onGranted: 获取权限失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void getInstallPermission() {
|
||||
@@ -516,8 +560,14 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
}
|
||||
|
||||
private void installXapk() {
|
||||
File file = new File("/storage/emulated/0/Download/Google Chrome_135.0.7049.100_APKPure.xapk");
|
||||
XapkUtils.getInstance().installXapk(file.getAbsolutePath());
|
||||
// File file = new File("/storage/emulated/0/Download/Google Chrome_135.0.7049.100_APKPure.xapk");
|
||||
File file = new File("/sdcard/Download/GoogleChrome_135.0.7049.100_APKPure.xapk");
|
||||
|
||||
// XapkUtils.getInstance().installXapk(file.getAbsolutePath());
|
||||
XapkInstaller xapkInstaller = XapkInstallerFactoryKt.createXapkInstaller(file.getAbsolutePath());
|
||||
if (xapkInstaller!=null) {
|
||||
xapkInstaller.installXapk(MainActivity.this);
|
||||
}
|
||||
}
|
||||
|
||||
private void requestPackageInstalls() {
|
||||
|
||||
@@ -23,6 +23,7 @@ public class InstallResultReceiver extends BroadcastReceiver {
|
||||
} else {
|
||||
String errorMsg = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE);
|
||||
Log.e(TAG, "安装失败: " + errorMsg);
|
||||
Toaster.show("安装失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,12 @@ public class PermissionUtils {
|
||||
Permission.MANAGE_EXTERNAL_STORAGE,
|
||||
};
|
||||
|
||||
public static final String[] Location_Permission_old = new String[]{
|
||||
Permission.READ_EXTERNAL_STORAGE,
|
||||
Permission.WRITE_EXTERNAL_STORAGE,
|
||||
// Permission.MANAGE_EXTERNAL_STORAGE,
|
||||
};
|
||||
|
||||
public static final String[] Install_Permission = new String[]{
|
||||
Permission.REQUEST_INSTALL_PACKAGES,
|
||||
};
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
import android.content.pm.PackageInstaller;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
@@ -12,6 +13,7 @@ import android.util.Log;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.example.mir4updater.activity.InstallActivity;
|
||||
import com.example.mir4updater.bean.Expansions;
|
||||
import com.example.mir4updater.bean.SplitApks;
|
||||
import com.example.mir4updater.receiver.InstallResultReceiver;
|
||||
@@ -56,6 +58,8 @@ public class XapkUtils {
|
||||
private static XapkUtils sInstance;
|
||||
private Context mContext;
|
||||
|
||||
public static final String PACKAGE_INSTALLED_ACTION = "SESSION_API_PACKAGE_INSTALLED";
|
||||
|
||||
private XapkUtils(Context context) {
|
||||
this.mContext = context;
|
||||
}
|
||||
@@ -313,15 +317,20 @@ public class XapkUtils {
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private static void install(PackageInstaller packageInstaller, int sessionId, Context context) {
|
||||
private void install(PackageInstaller packageInstaller, int sessionId, Context context) {
|
||||
try {
|
||||
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
|
||||
Intent intent = new Intent(context, InstallResultReceiver.class);
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(
|
||||
context,
|
||||
1, intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT
|
||||
);
|
||||
|
||||
// Intent intent = new Intent(context, InstallResultReceiver.class);
|
||||
// PendingIntent pendingIntent = PendingIntent.getBroadcast(
|
||||
// context,
|
||||
// 0, intent,
|
||||
// PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT
|
||||
// );
|
||||
Intent intent = new Intent(mContext, InstallActivity.class);
|
||||
intent.setAction(PACKAGE_INSTALLED_ACTION);
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
|
||||
|
||||
session.commit(pendingIntent.getIntentSender());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
@@ -411,9 +420,6 @@ public class XapkUtils {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Deprecated
|
||||
public static File unzipXapk(Context context, File xapkFile) throws IOException {
|
||||
File outputDir = new File(context.getExternalCacheDir(), "xapk_unzip");
|
||||
|
||||
9
app/src/main/res/layout/activity_install.xml
Normal file
9
app/src/main/res/layout/activity_install.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".activity.InstallActivity">
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -15,4 +15,8 @@
|
||||
<files-path
|
||||
name="files"
|
||||
path="." />
|
||||
<!-- 适配部分定制系统 -->
|
||||
<root-path
|
||||
name="root"
|
||||
path="." />
|
||||
</paths>
|
||||
|
||||
Reference in New Issue
Block a user