Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android以编程方式更新apk并查看安装结果_Android_Android Intent_Apk_Android Install Apk - Fatal编程技术网

android以编程方式更新apk并查看安装结果

android以编程方式更新apk并查看安装结果,android,android-intent,apk,android-install-apk,Android,Android Intent,Apk,Android Install Apk,我正在为我的应用程序编写应用程序更新程序。在我确保设备上有我的apk后,这是我在尝试更新的应用程序中执行的操作: Intent promptInstall = new Intent(Intent.ACTION_VIEW); File f = new File(apkLocation); promptInstall.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); _context.sta

我正在为我的应用程序编写应用程序更新程序。在我确保设备上有我的apk后,这是我在尝试更新的应用程序中执行的操作:

Intent promptInstall = new Intent(Intent.ACTION_VIEW);
File f = new File(apkLocation);    
promptInstall.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive");
_context.startActivity(promptInstall);
这将启动我的安装程序,其中显示应用程序权限,我可以单击“安装”。但是从这里,应用程序只是关闭,我没有收到任何消息(我希望对话框告诉我安装成功,让我可以选择按“关闭”或“打开”)。它只会进入设备的主屏幕,无需进一步通知

另一方面,当我手动打开应用程序时,它确实被更新了。 我怎样才能使安装程序按预期的方式运行?有什么要说明的吗


在写这篇文章时,我想知道发生这种情况的原因是否是当前应用程序在设备上被简单地覆盖,从而关闭它,并且由于其源被杀死而在某种程度上没有得到意图的结果?

首先,除非您是根用户或具有系统权限,否则您不能在没有提示的情况下安装。我不认为你在问这个,但你的一段不清楚

其次,如果安装一个正在运行的应用程序的更新版本,你会看到预期的行为:该应用程序被强制关闭并更新。您无法就地更新。您可以检测安装何时中止,因为调用安装程序的活动将恢复


为了更新正在运行的应用程序并使其保持运行,您需要一个单独的进程(应用程序)要监视安装并重新启动应用程序。

您所能做的就是使用intent筛选器注册接收器,如android.intent.action.PACKAGE\u安装或
android.intent.action.PACKAGE\u,您可以从中重新启动应用程序

<receiver android:enabled="true" android:exported="true" android:label="BootService" android:name="com.project.services.BootService">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <data android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED"/>
            <data android:scheme="package"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_INSTALL"/>
            <data android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action android:name="android.intent.action.PACKAGE_CHANGED"/>
            <data android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED"/>
            <data android:scheme="package"/>
        </intent-filter>
    </receiver>
</application>

要成功更新,您需要启动intent,URI将更新应用程序指示为新任务

 final Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK));
 "application/vnd.android.package-archive");
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);
我的帖子如下:


你应该考虑到谷歌已经在他们的条款和条件中明确声明,你不能对从play store下载的应用程序执行此操作(可能对amazon等没什么影响,但需要考虑一些因素)。谢谢,我知道,请在SW上阅读。这不是我的情况。如果你通过命令(
pm install
)进行更新,你还需要
android.permission.install\u PACKAGES
权限,这是签名级别。是的,这回答了我的问题,正如我在制定问题时所想的那样。我一直在阅读有关活动生命周期的文章,但找不到对这种行为的确切提及,尽管使用该应用程序被杀死是非常有意义的。我的选择是什么?我想我需要从不同于初始应用程序的范围启动安装活动。有什么想法吗?我刚刚尝试了@Bishwashs的代码,效果很好,所以我认为它实际上可以接收由包替换的广播。谢谢你的帮助。很好,这是个好消息。我试过了,效果很好。我刚刚添加了
if(context.getApplicationInfo().packageName.equals((intent.getData()).getSchemeSpecificPart())
检查以确保捕获了正确的广播。如果没有它,我的应用程序将在商店内执行任何应用程序更新后启动。很高兴听到它对您有所帮助。我建议在scheme旁边的清单中添加part filter,这样可以避免每次应用程序更新/安装等时应用程序不断启动。我尝试使用scheme旁边的过滤器,但这并没有阻止任何其他应用程序更新时应用程序启动。我必须根据intent.getData()手动检查上下文的packageName。两个主体条件相同,为什么要编写
if
if else
语句我错了吗?
 final Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK));
 "application/vnd.android.package-archive");
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);