首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓7:使用Runtime.getRuntime().exec安装NullPointerException

安卓7:使用Runtime.getRuntime().exec安装NullPointerException
EN

Stack Overflow用户
提问于 2017-09-04 20:17:02
回答 1查看 2.1K关注 0票数 6

我正在尝试使用常规的Runtime.getRuntime.exec()例程在Android7(三星和索尼)中安装APK。安装失败,在logcat中出现以下异常:

代码语言:javascript
复制
09-04 14:14:33.932 16623-16623/? D/AndroidRuntime: Calling main entry com.android.commands.pm.Pm
09-04 14:14:33.939 3695-3876/? D/PackageInstaller:  installation of android.content.pm.PackageInstaller$SessionParams@a4d2f0e for non-container user 0
09-04 14:14:33.940 16623-16623/? E/Pm: Error
                                       java.lang.NullPointerException
                                           at android.os.Parcel.readException(Parcel.java:1699)
                                           at android.os.Parcel.readException(Parcel.java:1646)
                                           at android.content.pm.IPackageInstaller$Stub$Proxy.createSession(IPackageInstaller.java:249)
                                           at com.android.commands.pm.Pm.doCreateSession(Pm.java:530)
                                           at com.android.commands.pm.Pm.runInstall(Pm.java:369)
                                           at com.android.commands.pm.Pm.run(Pm.java:142)
                                           at com.android.commands.pm.Pm.main(Pm.java:99)
                                           at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
                                           at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:301)
09-04 14:14:33.941 16623-16623/? I/art: System.exit called, status: 1
09-04 14:14:33.941 16623-16623/? I/AndroidRuntime: VM exiting with result code 1

我尝试将其实现为:

代码语言:javascript
复制
Process proc = Runtime.getRuntime().exec("pm install /sdcard/imo.apk");

因此:

代码语言:javascript
复制
Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/sh","-c","/system/bin/pm install /sdcard/imo.apk"});

但在这两种情况下都会发生异常。

在小于7的机器人中,它是有效的。

权限包括:

代码语言:javascript
复制
declared permissions:
  android.permission.INTERACT_ACROSS_USERS_FULL: prot=normal
requested permissions:
  android.permission.BIND_NOTIFICATION_LISTENER_SERVICE
  android.permission.READ_EXTERNAL_STORAGE
  android.permission.WRITE_EXTERNAL_STORAGE
  android.permission.READ_LOGS
User 0: ceDataInode=393939 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0
  gids=[1007]
  runtime permissions:
    android.permission.CLEAR_APP_USER_DATA: granted=true
    android.permission.INSTALL_PACKAGES: granted=true
    android.permission.READ_EXTERNAL_STORAGE: granted=true
    android.permission.INTERACT_ACROSS_USERS_FULL: granted=true
    android.permission.READ_LOGS: granted=true
    android.permission.CLEAR_APP_CACHE: granted=true
    android.permission.WRITE_EXTERNAL_STORAGE: granted=true

通过shell安装成功。提前感谢

EN

回答 1

Stack Overflow用户

发布于 2018-05-14 09:34:50

我找到了答案。虽然我不确定确切的原因是什么,但这是有效的。我提到了这个博客https://shoewann0402.github.io/2017/06/27/android-n-installSilent-and-uninstallSilent/,但它都是中文的。如果你也懂中文,或者你使用谷歌翻译。

新命令应该如下所示:

代码语言:javascript
复制
pm install -i <you installer package name> --user 0 /sdcard/com.ifeng.news2.apk

这是谷歌添加的一些新的安全机制,它要求您使用userId 0进行安装。此外,您还需要指定安装程序包名称。

然后在你的安装程序的清单文件中,添加android.permission.INTERACT_ACROSS_USERS_FULL此权限。那么它应该是有效的。我看到了一些关于userId的文档,但是没有足够的时间去深入研究它。如果你感兴趣,你可以自己搜索。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46036877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档