出这个问题找了很多办法,不太管用。最后是在安装apk之前卸载本app解决了问题。当我这样解决之后还报这样的问题,可能是安装的时候是测试版,版本更新是正式版,签名不一致出现了问题。解决问题思路一下。问题原因是手机里已经安装了项目包名“com.x.x.x”。
1.改掉applicationId,顺便改掉provider中authorities参数
把包名换成改掉 ${applicationId}
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
这个方法换了一个applicationId,手机系统识别就是两个不同的app,实际上会留下两个不同的app,这种结果不是我想要的,首先applicationId必须不变,不然相应的权限需要重新申请,很麻烦。所以解决办法是在applicationId不变的情况下,安装的时候写一个卸载APP方法。这样新一版app的权限,缓存,数据库,当前状态都可以继承下来。
//卸载
public static void uninstallAPP() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DELETE);
intent.setData(Uri.parse("package:" + packageInfo.packageName));
contexts.startActivity(intent);
installtionAPK();
}
//安装
private static void installtionAPK() {
String fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + apkName + "/" + apkName + ".apk";//承接我的代码,filename指获取到了我的文件相应路径
if (fileName != null) {
if (fileName.endsWith(".apk")) {
if (Build.VERSION.SDK_INT >= 24) {//判读版本是否在7.0以上
File file = new File(fileName);
Uri apkUri = FileProvider.getUriForFile(contexts, packageInfo.packageName + ".fileprovider", file);//在AndroidManifest中的android:authorities值
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
install.setDataAndType(apkUri, "application/vnd.android.package-archive");
contexts.startActivity(install);
} else {
Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
contexts.startActivity(install);
}
}
}
}
后记:问题在此就解决了,网上还有解决办法是v1,v2打包签名不对,最好v1打包,或全v1,v2全打包,试过了,不管用呢~