1

我的问题很难解释清楚......

我调用 phonegap 插件下载并解压缩 zip,并在回调中返回新页面的 url 以加载新页面:

bindings.js(绑定完成的地方):

showGameDetailComplete: function(data) {
    [...]
    $('#play-game').bind('tap',function() {
        var gameDownloader = new GameDownloader();
        gameDownloader.downloadGame(data.url, data.id, 
            function(data) {
                alert(data);
                document.location.href = data;
            }, function(data) {
                alert('Download failed');
            }
        );
    })
},

gamedownloader.js(JS-Android之间的链接):

GameDownloader.prototype.downloadGame = function(fileUrl, gameId,
     successCallback, failureCallback) {
PhoneGap.exec(successCallback, failureCallback, "GameDownloader", "download", [ fileUrl, gameId]);
};

GameDownloaderPlugin.java(Phonegap Android 原生插件):

public class GameDownloaderPlugin extends Plugin
{
[...]

@Override
public PluginResult execute(String action, JSONArray data, String callbackId)
{
    result = null;
    mCallbackId = callbackId;
    if (action.equals(ACTION_DOWNLOAD))
    {
        try
        {
            downloadGame(data.getString(0), data.getString(1));
            result = new PluginResult(PluginResult.Status.NO_RESULT);
            result.setKeepCallback(true);
            return result;
        }
        catch (JSONException e)
        {
            result = new PluginResult(PluginResult.Status.ERROR, "Param errors");
        }
    }
    else
    {
        result = new PluginResult(Status.INVALID_ACTION);
        Log.d("DirectoryListPlugin", "Invalid action : " + action + " passed");
    }
    return result;
}

private void downloadGame(String fileUrl, String gameId)
{
    try
    {
        /* Downloading the zip */
        [...]

        /* Unzip the zip */
        Intent iUnzip = new Intent(ctx, GameUnzipActivity.class);
        iUnzip.putExtra(UNZIP_GAMEID, gameId);
        iUnzip.putExtra(UNZIP_SRCFILE, fileName);
        ctx.startActivityForResult(this, iUnzip, GAME_UNZIP);
    }
    catch (IOException e)
    {
        if (LOG)
            Log.d("GameDownloaderPlugin", "Error: " + e);
        this.error(new PluginResult(PluginResult.Status.ERROR, "Error: " + e), mCallbackId);
    }

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case (GAME_UNZIP):
        {
            if (resultCode == Activity.RESULT_OK)
            {
                if (LOG)
                    Log.d("GameDownloaderPlugin", "Game unzipped! \\o/");
                this.success(new PluginResult(PluginResult.Status.OK, "../../games/" + mGameId + "/"), this.mCallbackId);
            }
            else
            {
                if (LOG)
                    Log.d("GameDownloaderPlugin", "Bide!");
                this.error(new PluginResult(PluginResult.Status.ERROR), this.mCallbackId);
            }               
        }
            break;
    }
}
}

所以这里调用了解压缩活动,然后在 onActivityResult() 中返回一个结果:

PluginResult(PluginResult.Status.OK, "../../games/" + mGameId + "/"), this.mCallbackId);

这里……没问题,游戏解压好了,回调也发送好了,在 bindings.js 中接收到了:

function(data) {
                alert(data);
                document.location.href = data + 'html/fr/index.html';
}

alert(data) 显示良好的回调,但 document.location.href 行 logcat 出现错误:

Error loading url content://com.tuto.android.provider.DataFileProvider/games/1/html/fr/index.html
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://com.tuto.android.provider.DataFileProvider/games/1/html/fr/index.html }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
at android.app.Activity.startActivityForResult(Activity.java:2817)
at com.phonegap.DroidGap.startActivityForResult(DroidGap.java:1523)
at android.app.Activity.startActivity(Activity.java:2923)
at com.phonegap.DroidGap$GapViewClient.shouldOverrideUrlLoading(DroidGap.java:1338)
at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216)
at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

对于信息,我使用提供程序来显示我的页面包含在 /data/data/ package /files 文件中,这就是我有这个 URL 的原因:

content://com.tuto.android.provider.DataFileProvider/games/1/html/fr/index.html

如果您想要更多解释,请告诉我更多,这很难理解。

4

1 回答 1

2

嗯......我终于找到了解决方案:

当我想显示一个新页面时,我使用一个新插件来第二次启动主要活动 DroidGap 并使用 url 参数:

public class MyActivity extends DroidGap
{
  [...]

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);

    Intent i = getIntent();
    Bundle b = i.getExtras();

    if (b == null)
    {
        super.loadUrl(PROV_WWW + "html/fr/index.html");
    }
    else
    {
        String url = b.getString("URL");

        super.loadUrl(url);
    }
  }
}

这更像是一种解决方法,而不是真正的解决方案,但它确实有效。

于 2012-01-13T08:16:39.960 回答