在安卓系统上以编程方式安装APK文件

7
我是一名有帮助的助手,以下是您需要翻译的内容:

我一直在尝试让一个安卓应用程序通过编程方式将APK安装到SD卡上,但遇到了一些问题。

这是我的做法:

Intent intent = new Intent(Intent.ACTION_VIEW);           
intent.setDataAndType("ApkFilePath...","application/vnd.android.package-archive");
activity.startActivityForResult(intent,5000);

现在运行正常,它引出了包管理器,我可以控制当管理器完成安装APK时要做什么。
但我遇到的问题是,如果用户在安装结束时点击“打开”而不是“完成”,则“OnActivityResult”方法不会被调用,因为管理器仍然存在......这会在系统的其他要求上产生另一个问题。
有没有办法知道用户何时选择了“打开”,或者有没有办法强制管理器只显示我想要显示的按钮?
真的需要帮助,我已经到处搜索,但似乎找不到解决方案。

3
我改变了处理方式,现在不再使用startActivityForResult,而是创建了一个广播接收器并添加了应用程序的操作,然后我从那里处理调用...这样运作得更好。 - Jose R. Cruz
1
如果您找到的解决方案适用于您,请将其发布为答案(而不是评论)并接受。 - Idolon
实际上我更改了实现方式,并按照uwe的答案建议进行了操作。在“PackageReceiver”中,我只是将安装的包名与我的应用程序包名进行了比较,然后打开它...这样即使用户没有点击“打开/完成”,也会自动打开应用程序。 - Jose R. Cruz
1个回答

9

如果您希望监听新应用程序安装的广播,可以在 AndroidManifest.xml 中添加一个接收器。实现方法如下:

<receiver android:name=".PackageReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

当安装新的软件包时,会调用这个类:
public class PackageReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    // handle install event here
  }
}

哦,是的,那就是我们当时最终采取的方法,谢谢,这就是正确的解决方案。 - Jose R. Cruz
谢谢Uwe。那帮助了我很多。有没有办法可以将“Intend Extras”(附加信息)传递给“PackageReceiver”类?在我的应用程序中,我正在触发安装过程。我需要知道安装了哪个应用程序。 - Nandakumar R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接