Activity 未使用 Android 的代号 One 本机代码找到

Activity not found using Codename One native code for Android

我正在尝试从我的应用程序安装 .apk 文件。

我将 .apk 文件放到其他应用程序也可以访问的目录中,然后,我在 Android native 中调用以下代码:

private static Activity activity() {
    return com.codename1.impl.android.AndroidNativeUtil.getActivity();
}   

public void install(String fileName) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.parse(getDownloadPath() + File.separator + fileName), "application/vnd.android.package-archive");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    activity().startActivity(intent);
}

public String getDownloadPath() {
    return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + File.separator + "myfolder";
}

我还在构建提示中添加了以下权限:

<uses-permission     android:name="android.permission.INSTALL_PACKAGES" />

日志也指明了路径,当我手动浏览到该路径时,.apk 就在那里。我也可以手动安装它。 然而,上面的代码给出了以下内容:

    D/Instrumentation( 4697): checkStartActivityResult  :Intent { act=android.intent.action.VIEW dat=/storage/emulated/0/Download/myfolder/MyOtherApp.apk typ=application/vnd.android.package-archive flg=0x10000000 }
    D/Instrumentation( 4697): checkStartActivityResult  inent is instance of inent:
    W/dalvikvm( 4697): threadid=16: thread exiting with uncaught exception (group=0x41f02c08)
    E/AndroidRuntime( 4697): FATAL EXCEPTION: Thread-3980
    E/AndroidRuntime( 4697): Process: com.myapplication.myapp, PID: 4697
    E/AndroidRuntime( 4697): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/storage/emulated/0/Download/myfolder/MyOtherApp.apk typ=application/vnd.android.package-archive flg=0x10000000 }
    E/AndroidRuntime( 4697):    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1660)
    E/AndroidRuntime( 4697):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1430)
    E/AndroidRuntime( 4697):    at android.app.Activity.startActivityForResult(Activity.java:3532)
    E/AndroidRuntime( 4697):    at android.app.Activity.startActivityForResult(Activity.java:3493)
    E/AndroidRuntime( 4697):    at com.codename1.impl.android.CodenameOneActivity.startActivityForResult(CodenameOneActivity.java:534)
    E/AndroidRuntime( 4697):    at android.app.Activity.startActivity(Activity.java:3735)
    E/AndroidRuntime( 4697):    at android.app.Activity.startActivity(Activity.java:3703)
    E/AndroidRuntime( 4697):    at com.codename1.impl.android.CodenameOneActivity.startActivity(CodenameOneActivity.java:540)
    E/AndroidRuntime( 4697):    at com.myapplication.cn1.application.interfaces.IApplicationNativeImpl.install(IApplicationNativeImpl.java:40)
    E/AndroidRuntime( 4697):    at com.myapplication.cn1.application.interfaces.IApplicationNativeStub.install(IApplicationNativeStub.java:17)
    E/AndroidRuntime( 4697):    at com.myapplication.cn1.application.Application.install(Application.java:33)
    E/AndroidRuntime( 4697):    at com.myapplication.myapp.worker.ApplicationWorker.install(ApplicationWorker.java:68)
    E/AndroidRuntime( 4697):    at com.myapplication.myapp.ui.component.MenuButton.doApplicationDownloadCallback(MenuButton.java:93)
    E/AndroidRuntime( 4697):    at com.myapplication.myapp.ui.component.MenuButton.callback(MenuButton.java:78)
    E/AndroidRuntime( 4697):    at com.myapplication.myapp.worker.ApplicationWorker.run(ApplicationWorker.java:59)
    E/AndroidRuntime( 4697):    at java.lang.Thread.run(Thread.java:841)
    W/ActivityManager( 2418):   Force finishing activity com.myapplication.myapp/.MyAppStub

用于安装的代码片段也可以在原始 Android 应用程序上成功运行。

有什么我忘记做的事情,或者在 CodenameOne 中使用 activity 错误吗?

安装应用程序中嵌入的 APK 听起来是不可能的,而且您会收到一个错误消息,指出没有 activity 可用于处理该文件。

问题出在这一行:

 intent.setDataAndType(Uri.parse(getDownloadPath() + File.separator + fileName), "application/vnd.android.package-archive");

应该是:

 intent.setDataAndType(Uri.fromFile(new File(getDownloadPath() + File.separator + fileName)), "application/vnd.android.package-archive");

原因是 file:/// 被添加在前面。

此外,似乎不需要 INSTALL_PACKAGES 权限。