最近项目中有个新需求,实现安卓APK的U盘升级。刚开始上网查找方法,踩了个大坑,方式是直接和USB设备建立连接,借助第三方库libaums识别U盘的文件系统,但是最新版的libaums库0.7.5版本在加载时出现各种错误,借助网络大神说的各种方法也没能调试成功,后来换了种实现方法,更简单,轻松解决问题。方法记录如下:
思路:获取U盘的挂载路径,直接读写U盘,读取到U盘中指定APK文件后,安装APK。
1.通过MEDIA广播获取挂载路径
首先在AndroidManifest.xml中,application下注册系统广播
<application ...>
<receiver android:name=".MediaReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_CHECKING" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<data android:scheme="file" />
</intent-filter>
</receiver>
</application>
然后创建MediaReceiver广播类,获取USB挂载路径
public class MediaReceiver extends BroadcastReceiver {
private final static String U_DISK_FILE_NAME = "test.apk";
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case Intent.ACTION_MEDIA_CHECKING:
break;
case Intent.ACTION_MEDIA_MOUNTED:
// 获取挂载路径, 读取U盘文件
Uri uri = intent.getData();
if (uri != null) {
String filePath = uri.getPath();
File rootFile = new File(filePath);
for (File file : rootFile.listFiles()) {
// 文件列表,进行相应操作...
if(file.getName().equals(U_DISK_FILE_NAME))
{
Intent install = new Intent(Intent.ACTION_VIEW);
//设置intent的数据类型是应用程序application
install.setDataAndType(Uri.parse("file://" + file.toString()),"application/vnd.android.package-archive");
//为这个新apk开启一个新的activity栈
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(install);
break;
}
}
}
break;
case Intent.ACTION_MEDIA_EJECT:
break;
case Intent.ACTION_MEDIA_UNMOUNTED:
break;
}
}
}
以上代码轻松实现安装U盘中APK的功能。
这篇博客记录了一个安卓项目中新需求的实现过程——通过U盘进行APK升级。作者最初尝试使用libaums库识别U盘文件系统,但遇到问题。最终,作者找到了一个更简单的方案:直接获取U盘挂载路径,读取APK文件并进行安装。通过监听MEDIA广播获取挂载路径,实现了功能。

942

被折叠的 条评论
为什么被折叠?



