)
android-实例-蒲公英-更新与安装-3-我的应用-CSDN博客通过app在线点击在线更新蒲公英网站自传app版本更新安装APK函数installApk(File apkFile)// 6. 安装 APK private void installApk(File apkFile) { Intent intent new Intent(Intent.ACTION_VIEW); Uri apkUri; if (Build.VERSION.SDK_INT Build.VERSION_CODES.N) { // Android 7.0 使用 FileProvider apkUri FileProvider.getUriForFile(context,context.getPackageName() .fileprovider, apkFile); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { apkUri Uri.fromFile(apkFile); } intent.setDataAndType(apkUri, application/vnd.android.package-archive); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); }File apkFile为下载后存放在安卓屏内的路径。installApk: 安装 /storage/emulated/0/Android/data/com.rx.anti/files/app_update_v26.03.apk实机包路径---------------------------------------------------------------------------------------------------------------------------------问题1执行以下语句出问题apkUri FileProvider.getUriForFile(context,context.getPackageName() .fileprovider, apkFile);解决问题1这行代码是Android 7.0应用内安装APK的标准写法用于通过FileProvider获取一个安全的文件URI绕过file://URI的严格限制。完整配置步骤3步走第1步在AndroidManifest.xml中声明Providerapplication !-- 其他配置 -- provider android:nameandroidx.core.content.FileProvider android:authorities${applicationId}.fileprovider android:exportedfalse android:grantUriPermissionstrue meta-data android:nameandroid.support.FILE_PROVIDER_PATHS android:resourcexml/file_paths / /provider /application注意authorities必须和代码中传入的一致。用${applicationId}会自动替换为包名。第2步创建file_paths.xml配置文件在res/xml/目录下创建file_paths.xml?xml version1.0 encodingutf-8? paths !-- 外部存储根目录 -- external-path nameexternal_root path. / !-- 应用私有外部存储目录 -- external-files-path nameexternal_files path. / !-- 应用私有内部存储目录 -- files-path nameinternal_files path. / !-- 外部缓存目录 -- external-cache-path nameexternal_cache path. / !-- 内部缓存目录 -- cache-path namecache path. / !-- Android 10 媒体文件目录 -- external-media-path nameexternal_media path. / /paths各路径对应关系xml标签对应Java路径files-pathcontext.getFilesDir()cache-pathcontext.getCacheDir()external-pathEnvironment.getExternalStorageDirectory()external-files-pathcontext.getExternalFilesDir(null)external-cache-pathcontext.getExternalCacheDir()external-media-pathcontext.getExternalMediaDirs()第3步代码中生成URI并授权private void installApk() { // 1. 获取APK文件 File apkFile new File(getExternalFilesDir(null), app.apk); // 2. 通过FileProvider获取URI Uri apkUri FileProvider.getUriForFile( this, getPackageName() .fileprovider, apkFile ); // 3. 创建安装Intent Intent intent new Intent(Intent.ACTION_VIEW); intent.setDataAndType(apkUri, application/vnd.android.package-archive); // 4. 授予临时读写权限关键 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 5. 启动安装 startActivity(intent); }我的问题1解决了问题2函数installApk(File apkFile)中执行 startActivity(intent);时跳出安装提示框点击安装不允许安装了。该软件包与同一名称的现有软件包存在冲突。为什么会报这个错Android要求同一个包名Package Name的APK安装时签名证书必须一致。本机已经安装的app与从蒲公英下载的apk签名不一致。参照资料android-实例-蒲公英-更新与安装-生成统一的签名https://blog.csdn.net/weixin_42770272/article/details/163625936?sharetypeblogdetailsharerId163625936sharereferPCsharesourceweixin_42770272spm1011.2480.3001.8118