现在有个需求:一个Android11的设备上,look.apk的功能是在每次检测到有u盘插入设备监听到ACTION_MEDIA_MOUNTED广播后会去访问u盘的挂载路径访问u盘里面是否有db.apk,如果有就会用 pm.getPackageArchiveInfo(absPath, PackageManager.GET_ACTIVITIES);来获取apk的版本号和系统已经安装号的db.apk对比,看是否后需要安装u盘里面的db.apk来进行更新。。现在发现look.apk里面实现getPackageArchiveInfo去访问u盘,会出现在卸载的时候无法成功卸载u盘,导致下一次插入u盘后无法挂载的现象针。对这个情况,是否可以在监听到u盘插入后把db.apk拷贝到设备中user和userdebug版本都可以访问到的某目录下,然后再在通过pm.getPackageArchiveInfo获取刚刚被拷贝的dbapk版本号,在u盘卸载的时候就删除拷贝的db.apk,这里请提供下哪个目录可以被拷贝文件和详细的代码实现方式
时间: 2024-02-23 20:59:47 浏览: 30
你的想法是可行的,可以将u盘中的db.apk文件拷贝到设备的可访问目录中,然后进行版本对比。至于可以被拷贝的目录,可以选择设备的SD卡目录(一般为/storage/emulated/0/),或者应用的私有目录(一般为/data/data/包名/)。
以下是实现的步骤和代码示例:
1. 在AndroidManifest.xml中添加文件读写权限
```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
```
2. 在监听到u盘插入的广播中,将db.apk文件拷贝到设备可访问目录中
```java
private void copyDbApkToSdcard(String absPath) {
String dstPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "db.apk";
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(absPath);
fos = new FileOutputStream(dstPath);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
fos.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
3. 使用PackageManager获取apk的版本号
```java
private int getDbApkVersion(Context context) {
String dstPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "db.apk";
PackageManager pm = context.getPackageManager();
PackageInfo packageInfo = pm.getPackageArchiveInfo(dstPath, PackageManager.GET_ACTIVITIES);
if (packageInfo != null) {
return packageInfo.versionCode;
} else {
return -1;
}
}
```
4. 在u盘卸载的广播中,删除拷贝的db.apk文件
```java
private void deleteDbApkFromSdcard() {
String dstPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "db.apk";
File file = new File(dstPath);
if (file.exists()) {
file.delete();
}
}
```
需要注意的是,如果在私有目录中拷贝文件,则需要使用应用的Context对象获取目录路径,如下所示:
```java
String dstPath = context.getFilesDir().getAbsolutePath() + File.separator + "db.apk";
```
至于具体选择哪个目录,可以根据实际情况来选择。如果需要多个应用共享该文件,则建议选择SD卡目录;如果只有一个应用使用该文件,则建议选择应用的私有目录。