apk升级

apk本地升级,可以直接调用系统的升级程序:

		Uri uri = Uri.fromFile( new File(fileName,apkname));
		Intent intent = new Intent(Intent. ACTION_VIEW );
		intent.setDataAndType(uri, "application/vnd.android.package-archive" );
		mainactivity.startActivity(intent);
也可以调用系统的apk升级接口进行升级,但需要获得root权限。


参考:

http://www.cnblogs.com/abob/archive/2010/12/16/1908356.html


apk的网络升级,可以分为以下几个步骤:

1.获得当前版本号

2.获得服务器的版本号并进行对比

3.下载apk

4.调用系统升级程序进行升级


1.获取当前apk的版本号:

name = mainactivity.getPackageManager().getPackageInfo(packageName, 0).versionName;
version = mainactivity.getPackageManager().getPackageInfo(packageName, 0).versionCode;
参考:

http://www.eoeandroid.com/thread-21154-1-1.html


2.可在服务器上放上关于要升级apk的版本信息及相应的升级限制。如果要进行服务器和客户端交互,需要tomcat服务器,如果只是简单的下载文件升级,采用appach服务器即可。使用的升级文档,可以采用多种形式,本人使用的是xml文档。

java解析xml文档参考:

http://blog.youkuaiyun.com/youyajie/article/details/7461325

http://hi.baidu.com/liuzy84/item/3b7ffd12f28e73a4feded59f


3.从服务器上下载apk,对比版本并升级。

参考:

http://www.cnblogs.com/shmily0703/archive/2012/04/19/shmily_apk_update.html

http://blog.youkuaiyun.com/peijiangping1989/article/details/7431491

http://www.cnblogs.com/shmily0703/archive/2012/04/19/shmily_apk_update.html

http://52android.blog.51cto.com/2554429/496621                                                                          //关于网络编程的简单使用


4.对下载下来的apk安装,可以采用本地升级的方法,调用系统程序进行安装。


需要注意的是,网络下载apk的时候,需要在AndroidManifest.xml文件中设置权限才能把下载下来的apk写入路径中,同时创建目录,不能一次创建多级目录,一次只能创建一级目录:

	<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />


Android设备上进行APK升级时,如果遇到“未安装应用”的错误提示,通常与权限设置、文件路径问题或系统兼容性有关。以下是针对这一问题的详细分析及解决方法。 ### 1. 检查安装权限 从Android 8.0(API 26)开始,系统引入了`REQUEST_INSTALL_PACKAGES`权限,应用程序需要显式请求用户授权才能安装APK。若未获得该权限,即使调用安装命令也会失败。 ```java Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivityForResult(intent, REQUEST_INSTALL_PERMISSION); ``` 在`onActivityResult()`中处理回调结果: ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_INSTALL_PERMISSION) { if (resultCode == RESULT_OK) { installApk(); } else { Toast.makeText(this, "未授权安装应用", Toast.LENGTH_SHORT).show(); } } } ``` 确保在`AndroidManifest.xml`中声明权限: ```xml <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> ``` ### 2. 文件路径与存储权限适配 在Android 10及以上版本中,应用默认运行在**Scoped Storage**模式下,访问外部存储需使用`MediaStore`或`Storage Access Framework`。若直接通过文件路径安装APK,可能会因路径不可见而失败。 建议将APK文件保存到应用私有目录或使用`Context.getExternalFilesDir()`获取可访问路径: ```java File dir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); File apkFile = new File(dir, "app-release.apk"); ``` 下载完成后,使用`FileProvider`生成内容URI进行安装: ```java Uri contentUri = FileProvider.getUriForFile(context, "com.example.fileprovider", apkFile); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent); ``` ### 3. 清理残留APK文件 某些设备(如OPPO、VIVO)在安装失败后会在`/data/local/tmp/`目录下保留APK文件,可能导致后续安装冲突。可通过以下方式清理: - 使用RE管理器挂载读写权限; - 进入`/data/local/tmp/`目录; - 删除其中所有`.apk`文件。 此外,检查APK是否损坏,重新下载并尝试安装。 ### 4. Android 11及以上版本的安装限制 从Android 11开始,系统对后台安装行为进行了更严格的限制。若应用处于后台状态尝试安装APK,可能被系统阻止。建议引导用户手动点击通知或跳转至安装界面完成操作。 ### 5. Shell命令安装APK(适用于系统应用或Root环境) 在具备系统权限或Root权限的设备上,可通过执行Shell命令安装APK: ```java Process process = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(process.getOutputStream()); outputStream.writeBytes("pm install -r /sdcard/app-release.apk\n"); outputStream.writeBytes("exit\n"); outputStream.flush(); process.waitFor(); ``` 注意:此方法仅适用于系统签名应用或已Root设备,普通应用无法直接调用`su`命令。 ### 6. 处理Android 15(API 34)的新限制 Android 15进一步加强了对广播接收器的限制,若在安装过程中触发了未正确配置的广播,可能导致安装流程中断。确保所有动态注册的广播接收器都明确指定了导出属性: ```xml <receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> </intent-filter> </receiver> ``` 同时,避免在未授权的情况下监听敏感广播。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值