从我自己的应用程序读取另一个应用程序的 .apk
Read .apk of another app from my own app
有什么方法可以在没有 root 访问权限的情况下从我自己的应用程序扫描其他应用程序的 .apk 文件?应该有,因为有像 APK Extractor 这样的应用程序可以让您获取任何已安装应用程序的 .apk。最好的是,APK Extractor 不需要 root 访问权限。
我尝试通过使用 ProcessBuilder
并调用命令 pm list packages
来获取已安装的软件包,然后我会 运行 pm path com.package.name
来获取每个 .apk 的路径.我得到了有效的路径,但是当我尝试使用 File apkFile = new File(apkPath);
打开它时,我得到
java.io.FileNotFoundException: /data/app/some.app.package/base.apk
open failed: ENOENT (No such file or directory)
这基本上意味着我没有读取该文件的权限。
如果您想访问此 APK,您需要 SU 访问权限。阅读更多内容 here。
如果只是使用常规 phone,Android OS 出于安全原因不会让您访问其他 APK。另外,您确定用户确实在 phone 上安装了其他 APK 吗?
我在另一个问题中找到了解决方案,here is direct link to answer in another thread。
为了懒人,我也复制了这里的答案。
- First you get all installed applications,
- For each one, get public source directory.
- copy the file to the SDCard.
Note: No need to be rooted.
Here is the snippt code:
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = getPackageManager().queryIntentActivities(mainIntent, 0);
for (Object object : pkgAppsList) {
ResolveInfo info = (ResolveInfo) object;
File file = new File(info.activityInfo.applicationInfo.publicSourceDir);
// Copy the .apk file to wherever
}
有什么方法可以在没有 root 访问权限的情况下从我自己的应用程序扫描其他应用程序的 .apk 文件?应该有,因为有像 APK Extractor 这样的应用程序可以让您获取任何已安装应用程序的 .apk。最好的是,APK Extractor 不需要 root 访问权限。
我尝试通过使用 ProcessBuilder
并调用命令 pm list packages
来获取已安装的软件包,然后我会 运行 pm path com.package.name
来获取每个 .apk 的路径.我得到了有效的路径,但是当我尝试使用 File apkFile = new File(apkPath);
打开它时,我得到
java.io.FileNotFoundException: /data/app/some.app.package/base.apk
open failed: ENOENT (No such file or directory)
这基本上意味着我没有读取该文件的权限。
如果您想访问此 APK,您需要 SU 访问权限。阅读更多内容 here。 如果只是使用常规 phone,Android OS 出于安全原因不会让您访问其他 APK。另外,您确定用户确实在 phone 上安装了其他 APK 吗?
我在另一个问题中找到了解决方案,here is direct link to answer in another thread。
为了懒人,我也复制了这里的答案。
- First you get all installed applications,
- For each one, get public source directory.
- copy the file to the SDCard.
Note: No need to be rooted.
Here is the snippt code:
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); final List pkgAppsList = getPackageManager().queryIntentActivities(mainIntent, 0); for (Object object : pkgAppsList) { ResolveInfo info = (ResolveInfo) object; File file = new File(info.activityInfo.applicationInfo.publicSourceDir); // Copy the .apk file to wherever }