2012-01-09 4 views
1

Моя проблема довольно трудно четко объяснить ...ActivityNotFoundException с document.location.href на плагин обратного вызова

я называю 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 (The 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'; 
} 

Индикатор уведомление (данные) показывает хорошую функцию обратного вызова, но 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) 

И для информации, я использую поставщик, чтобы показать мои страницы включены в/данные/данные/пакет/файлов файл, поэтому у меня есть этот URL:

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

Если вы хотите больше экспликации сказать мне больше, это очень трудно понять.

ответ

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); 
    } 
    } 
} 

Это скорее обходное решение, чем реальное решение, но оно фактически работает.

+0

+1 для последующего устранения вашего обхода, спасибо! –

Смежные вопросы