|
|
@@ -203,26 +203,73 @@ public class VersionUpdateUtil {
|
|
|
/**
|
|
|
* 安装APK
|
|
|
*/
|
|
|
+ /**
|
|
|
+ * 安装APK
|
|
|
+ */
|
|
|
public void installApk(Uri apkUri) {
|
|
|
Log.i(TAG, "开始安装APK: " + apkUri);
|
|
|
+ Log.i(TAG, "APK URI Scheme: " + (apkUri != null ? apkUri.getScheme() : "null"));
|
|
|
|
|
|
- Intent intent = new Intent(Intent.ACTION_VIEW);
|
|
|
- intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
|
|
|
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
-
|
|
|
- // Android 7.0及以上需要添加临时权限
|
|
|
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
|
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
|
+ if (apkUri == null) {
|
|
|
+ Log.e(TAG, "APK URI 为空,无法安装");
|
|
|
+ Toast.makeText(context, "安装文件路径无效", Toast.LENGTH_SHORT).show();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
+ // 检查安装权限 (Android 8.0及以上)
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
|
+ boolean canInstall = context.getPackageManager().canRequestPackageInstalls();
|
|
|
+ Log.i(TAG, "安装权限检查 (Android 8.0+): " + (canInstall ? "已授予" : "未授予"));
|
|
|
+ if (!canInstall) {
|
|
|
+ Log.w(TAG, "缺少安装权限,可能导致安装失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查URI可读性
|
|
|
+ checkUriReadable(apkUri);
|
|
|
+
|
|
|
+ // 记录更多URI信息
|
|
|
+ Log.i(TAG, "URI Authority: " + apkUri.getAuthority());
|
|
|
+ Log.i(TAG, "URI Path: " + apkUri.getPath());
|
|
|
+ Log.i(TAG, "URI Query: " + apkUri.getQuery());
|
|
|
+
|
|
|
+ Intent intent = new Intent(Intent.ACTION_VIEW);
|
|
|
+ intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
|
|
|
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
|
+
|
|
|
+ Log.i(TAG, "启动安装Intent,Flags: " + Integer.toHexString(intent.getFlags()));
|
|
|
+
|
|
|
context.startActivity(intent);
|
|
|
+ Log.i(TAG, "安装Intent已启动");
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
|
- Log.e(TAG, "安装APK失败: " + e.getMessage());
|
|
|
+ Log.e(TAG, "安装APK失败: " + e.getMessage(), e);
|
|
|
+ Toast.makeText(context, "安装失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
|
|
|
+ } catch (Error e) {
|
|
|
+ // 捕获Error,防止应用崩溃
|
|
|
+ Log.e(TAG, "安装APK时发生严重错误: " + e.getMessage(), e);
|
|
|
Toast.makeText(context, "安装失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 检查URI是否可读
|
|
|
+ */
|
|
|
+ private void checkUriReadable(Uri uri) {
|
|
|
+ try {
|
|
|
+ // 尝试打开输入流来验证URI是否可读
|
|
|
+ context.getContentResolver().openInputStream(uri).close();
|
|
|
+ Log.i(TAG, "URI可读性检查: 成功");
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.w(TAG, "URI可读性检查失败: " + e.getMessage());
|
|
|
+ Log.w(TAG, "这可能是因为权限不足或文件不存在");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 版本更新检查监听器
|