android - 从 apk 文件启动 Activity

标签 android launching-application android-install-apk

我正在尝试从外部 apk 文件启动 Activity 。 apk 文件是一个简单的文本显示,我从一个 URL 下载它到/mnt/sdcard/中的本地挂载目录。到那时一切正常。 现在,我想从该文件开始一项 Activity ,但出现错误。两种类型,取决于 Intent 构造。以下是具有关联 LogCat 的两个实现,'targetFilePath' 相同。 案例一:

try {
    Intent install = new Intent(Intent.ACTION_VIEW)
    .setData(Uri.fromFile(new File(targetFilePath)))
    .setType("application/vnd.android.package-archive");
    startActivity(install);
}
catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(DownloadFile.this, "apk file launch error: " +   e.getMessage(), Toast.LENGTH_LONG).show();
}

Logcat:

08-26 17:03:02.153: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.VIEW typ=application/vnd.android.package-archive }
08-26 17:03:02.153: W/System.err(390): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=application/vnd.android.package-archive }
08-26 17:03:02.162: W/System.err(390):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)
08-26 17:03:02.162: W/System.err(390):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
08-26 17:03:02.162: W/System.err(390):  at android.app.Activity.startActivityForResult(Activity.java:2817)
08-26 17:03:02.162: W/System.err(390):  at android.app.Activity.startActivity(Activity.java:2923)
08-26 17:03:02.162: W/System.err(390):  at com.agorasoft.sandbox.DownloadFile$1.onClick(DownloadFile.java:137)
08-26 17:03:02.162: W/System.err(390):  at android.view.View.performClick(View.java:2408)
08-26 17:03:02.172: W/System.err(390):  at android.view.View$PerformClick.run(View.java:8816)
08-26 17:03:02.172: W/System.err(390):  at android.os.Handler.handleCallback(Handler.java:587)
08-26 17:03:02.172: W/System.err(390):  at android.os.Handler.dispatchMessage(Handler.java:92)
08-26 17:03:02.172: W/System.err(390):  at android.os.Looper.loop(Looper.java:123)
08-26 17:03:02.182: W/System.err(390):  at android.app.ActivityThread.main(ActivityThread.java:4627)
08-26 17:03:02.182: W/System.err(390):  at java.lang.reflect.Method.invokeNative(Native Method)
08-26 17:03:02.182: W/System.err(390):  at java.lang.reflect.Method.invoke(Method.java:521)
08-26 17:03:02.182: W/System.err(390):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-26 17:03:02.182: W/System.err(390):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-26 17:03:02.182: W/System.err(390):  at dalvik.system.NativeStart.main(Native Method)
08-26 17:03:21.761: D/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol

案例二:

try {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkUri = Uri.fromFile(new File(targetFilePath));
    intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
    startActivity(intent);
}
catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(DownloadFile.this, "apk file launch error: " +   e.getMessage(), Toast.LENGTH_LONG).show();
}

解析错误弹窗:解析包时出现问题

LogCat:

08-26 17:09:48.862: W/PackageParser(329): Unable to read AndroidManifest.xml of /mnt/sdcard/Downloads/ApkTest.apk
08-26 17:09:48.862: W/PackageParser(329): java.io.FileNotFoundException: AndroidManifest.xml
08-26 17:09:48.862: W/PackageParser(329):   at android.content.res.AssetManager.openXmlAssetNative(Native Method)
08-26 17:09:48.862: W/PackageParser(329):   at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:485)
08-26 17:09:48.862: W/PackageParser(329):   at android.content.res.AssetManager.openXmlResourceParser(AssetManager.java:453)
08-26 17:09:48.862: W/PackageParser(329):   at android.content.pm.PackageParser.parsePackage(PackageParser.java:396)
08-26 17:09:48.862: W/PackageParser(329):   at com.android.packageinstaller.PackageUtil.getPackageInfo(PackageUtil.java:79)
08-26 17:09:48.862: W/PackageParser(329):   at com.android.packageinstaller.PackageInstallerActivity.onCreate(PackageInstallerActivity.java:242)
08-26 17:09:48.862: W/PackageParser(329):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-26 17:09:48.862: W/PackageParser(329):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-26 17:09:48.862: W/PackageParser(329):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-26 17:09:48.862: W/PackageParser(329):   at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-26 17:09:48.862: W/PackageParser(329):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-26 17:09:48.862: W/PackageParser(329):   at android.os.Handler.dispatchMessage(Handler.java:99)
08-26 17:09:48.862: W/PackageParser(329):   at android.os.Looper.loop(Looper.java:123)
08-26 17:09:48.862: W/PackageParser(329):   at android.app.ActivityThread.main(ActivityThread.java:4627)
08-26 17:09:48.862: W/PackageParser(329):   at java.lang.reflect.Method.invokeNative(Native Method)
08-26 17:09:48.862: W/PackageParser(329):   at java.lang.reflect.Method.invoke(Method.java:521)
08-26 17:09:48.862: W/PackageParser(329):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-26 17:09:48.862: W/PackageParser(329):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-26 17:09:48.862: W/PackageParser(329):   at dalvik.system.NativeStart.main(Native Method)
08-26 17:09:48.862: W/PackageInstaller(329): Parse error when parsing manifest. Discontinuing installation
08-26 17:09:49.902: I/ActivityManager(59): Displayed activity com.android.packageinstaller/.PackageInstallerActivity: 1168 ms (total 1168 ms)

对于冗长的参数,我们深表歉意,但似乎很奇怪,首先,它不起作用,然后我对 intent/install 定义的两种语法有不同的行为。 调用应用程序和 apk 文件都具有相同的 SDK 目标/最小版本。在这段代码的调用应用程序 list 中没有设置特殊权限(我需要吗?)。 谢谢

最佳答案

文档包含您的答案:Intent.setType

This is used to create intents that only specify a type and not data, for example to indicate the type of data to return.

This method automatically clears any data that was previously set (for example by setData(Uri)).

以及 Intent.setDataAndType 的文档

This method should very rarely be used -- it allows you to override the MIME type that would ordinarily be inferred from the data with your own type given here.

简而言之,您在构造此 Intent 时无需指定类型,它会根据给定的 URI 从数据本身推断出来。

综上所述,nandeesh 的评论似乎是正确的 - 您尝试安装的软件包看起来已损坏。还值得注意的是,如果您打算将此应用发布到 Play 商店,则开发者协议(protocol)不允许下载或安装其他 apk 的应用。

关于android - 从 apk 文件启动 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12132335/

相关文章:

c++ - Eclipse项目运行问题

java - 在具有更新的 Android 版本的设备中重新构建和运行 Android 程序时出错(androidapi 15 rev1 到 api 15 rev2)

android - 如何计算 num_partition_sectors 和 start_sector 以从 android rom 的 system.img 创建 rawprogram0.xml 或 rawprogram_unsparse.xml?

javascript - 网站宽度 jquery.scollto 插件不适用于所有移动浏览器

android - 应用程序启动时出现 ClassNotFoundException

iOS 7 +'s "再见快照”

java - 不同 Android 版本的应用程序大小不同

Android Things 20 分钟 apk 安装时间

java - Android 方向更改导致应用程序崩溃

android - 使用完毕后是否需要调用 HttpURLConnection.disconnect