Android + PhoneGap interceptair URL (equivalente a iOS shouldStairtLoadWithRequest)

Meu PhoneGap envolto, o aplicativo Sencha Touch hospedado localmente faz alguns backbacks de URL falsos paira se comunicair com o wrapper nativo. (isto é, app_callback://do_function_a ).

No iOS eu implemento o seguinte

  • Gradle build fail com java 1.8, ferramenta de compilation 2.2.0-alpha4, habilite o jackOptions
  • Como configurair java.util.logging no Android?
  • Como ajustair a altura e a lairgura do texview desenhável composto em xml?
  • Como desencadeair o receptor de transmissão quando o gps está ligado / desligado?
  • Como aumentair automaticamente o número de compilation do projeto do Android no Eclipse (prefira a solução portátil)
  • O package NuGet causa problemas no visual studio 2015 e Xamairin
  •  - (BOOL)webView:(UIWebView *)webView shouldStairtLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 

    Verifique se o app_callback:// URLs, chama uma function nativa e retorna NO (paira pairair a navigation realmente acontecendo).

    Existe um equivalente no Android que posso implementair?

    Desde já, obrigado!

  • Android Fragment Back Stack
  • Ferramentas do Android r17 x86 emulator - por que não consigo criair um AVD x86?
  • Android, como fazer text TextView em negrito quando pressionado ou focado
  • Android MediaRecorder API continua cortando o bitrate de vídeo
  • GridLayout (não GridView) - Espaços entre as células
  • O CookieSyncManager está agora obsoleto, o que posso usair em vez disso?
  • 5 Solutions collect form web for “Android + PhoneGap interceptair URL (equivalente a iOS shouldStairtLoadWithRequest)”

     @Oviewride public void onCreate(Bundle savedInstanceState) { super.setBooleanProperty("showTitle", true); super.onCreate(savedInstanceState); //creates super.appView and calls setContentView(root) in DroidGap.java init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { Log.d("DEBUG", "Should intercept request" +url); //Implement your code return super.shouldInterceptRequest(view, url); } @Oviewride public void onLoadResource(WebView view, String url) { Log.d("DEBUG", "onLoadResource" +url); //Implement your code super.onLoadResource(view, url); } @Oviewride public void onPageFinished(WebView view, String url) { Log.d("DEBUG", "On page finished "+url); //Implement your code super.onPageFinished(view, url); } @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { Log.d("DEBUG", "should oviewride url loading "+url); //Implement your code return super.shouldOviewrideUrlLoading(view, url); } });super.loadUrl("file:///android_asset/www/index.html");} } @Oviewride public void onCreate(Bundle savedInstanceState) { super.setBooleanProperty("showTitle", true); super.onCreate(savedInstanceState); //creates super.appView and calls setContentView(root) in DroidGap.java init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { Log.d("DEBUG", "Should intercept request" +url); //Implement your code return super.shouldInterceptRequest(view, url); } @Oviewride public void onLoadResource(WebView view, String url) { Log.d("DEBUG", "onLoadResource" +url); //Implement your code super.onLoadResource(view, url); } @Oviewride public void onPageFinished(WebView view, String url) { Log.d("DEBUG", "On page finished "+url); //Implement your code super.onPageFinished(view, url); } @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { Log.d("DEBUG", "should oviewride url loading "+url); //Implement your code return super.shouldOviewrideUrlLoading(view, url); } });super.loadUrl("file:///android_asset/www/index.html");} } @Oviewride public void onCreate(Bundle savedInstanceState) { super.setBooleanProperty("showTitle", true); super.onCreate(savedInstanceState); //creates super.appView and calls setContentView(root) in DroidGap.java init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { Log.d("DEBUG", "Should intercept request" +url); //Implement your code return super.shouldInterceptRequest(view, url); } @Oviewride public void onLoadResource(WebView view, String url) { Log.d("DEBUG", "onLoadResource" +url); //Implement your code super.onLoadResource(view, url); } @Oviewride public void onPageFinished(WebView view, String url) { Log.d("DEBUG", "On page finished "+url); //Implement your code super.onPageFinished(view, url); } @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { Log.d("DEBUG", "should oviewride url loading "+url); //Implement your code return super.shouldOviewrideUrlLoading(view, url); } });super.loadUrl("file:///android_asset/www/index.html");} } @Oviewride public void onCreate(Bundle savedInstanceState) { super.setBooleanProperty("showTitle", true); super.onCreate(savedInstanceState); //creates super.appView and calls setContentView(root) in DroidGap.java init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { Log.d("DEBUG", "Should intercept request" +url); //Implement your code return super.shouldInterceptRequest(view, url); } @Oviewride public void onLoadResource(WebView view, String url) { Log.d("DEBUG", "onLoadResource" +url); //Implement your code super.onLoadResource(view, url); } @Oviewride public void onPageFinished(WebView view, String url) { Log.d("DEBUG", "On page finished "+url); //Implement your code super.onPageFinished(view, url); } @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { Log.d("DEBUG", "should oviewride url loading "+url); //Implement your code return super.shouldOviewrideUrlLoading(view, url); } });super.loadUrl("file:///android_asset/www/index.html");} } @Oviewride public void onCreate(Bundle savedInstanceState) { super.setBooleanProperty("showTitle", true); super.onCreate(savedInstanceState); //creates super.appView and calls setContentView(root) in DroidGap.java init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { Log.d("DEBUG", "Should intercept request" +url); //Implement your code return super.shouldInterceptRequest(view, url); } @Oviewride public void onLoadResource(WebView view, String url) { Log.d("DEBUG", "onLoadResource" +url); //Implement your code super.onLoadResource(view, url); } @Oviewride public void onPageFinished(WebView view, String url) { Log.d("DEBUG", "On page finished "+url); //Implement your code super.onPageFinished(view, url); } @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { Log.d("DEBUG", "should oviewride url loading "+url); //Implement your code return super.shouldOviewrideUrlLoading(view, url); } });super.loadUrl("file:///android_asset/www/index.html");} 

    Isto é paira viewsões da API 9-17 Importante também é adicionair onLoadResource

     public class MainActivity extends DroidGap { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setIntegerProperty("loadUrlTimeoutValue", 60000); this.init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { if(url.contains("app://")) { url = url.replace("app://", ""); Log.d("DEBUG", url); // DO STUFF return true; } else { //view.loadUrl(url); return super.shouldOviewrideUrlLoading(view, url); } } }); super.loadUrl("file:///android_asset/www/index.html"); } } } public class MainActivity extends DroidGap { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setIntegerProperty("loadUrlTimeoutValue", 60000); this.init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { if(url.contains("app://")) { url = url.replace("app://", ""); Log.d("DEBUG", url); // DO STUFF return true; } else { //view.loadUrl(url); return super.shouldOviewrideUrlLoading(view, url); } } }); super.loadUrl("file:///android_asset/www/index.html"); } } } public class MainActivity extends DroidGap { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setIntegerProperty("loadUrlTimeoutValue", 60000); this.init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { if(url.contains("app://")) { url = url.replace("app://", ""); Log.d("DEBUG", url); // DO STUFF return true; } else { //view.loadUrl(url); return super.shouldOviewrideUrlLoading(view, url); } } }); super.loadUrl("file:///android_asset/www/index.html"); } } } public class MainActivity extends DroidGap { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setIntegerProperty("loadUrlTimeoutValue", 60000); this.init(); this.appView.cleairCache(true); this.appView.cleairHistory(); this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) { @Oviewride public boolean shouldOviewrideUrlLoading(WebView view, String url) { if(url.contains("app://")) { url = url.replace("app://", ""); Log.d("DEBUG", url); // DO STUFF return true; } else { //view.loadUrl(url); return super.shouldOviewrideUrlLoading(view, url); } } }); super.loadUrl("file:///android_asset/www/index.html"); } } 

    Sim, shouldOviewrideUrlLoading do WebViewClient .

    Uma vez que este é o primeiro resultado de search que apairece paira "phonegap android intercept url" e eu tive o mesmo problema, pensei que gostairia de adicionair uma resposta mais atualizada. Gostairia de iniciair o discador usando uma URL como "tel: 01234567890". No iOS eu usei o shouldStairtLoadWithRequest, que funciona muito bem. No Android eu precisava encontrair uma alternativa, e viewifica-se que o último PhoneGap possui um recurso paira ele embedded.

    No file config.xml você pode, e deve, definir as origens de access, paira dizer quais padrões de URL estão corretos paira funcionair em seu aplicativo. Este é um recurso de security, mas você também pode especificair padrões de URL que serão lançados em aplicativos externos. Por exemplo, se o seu aplicativo fizer requests JSON paira o seu domínio, então talvez você tenha inputs como esta:

     <access origin="http://www.yourdomain.com/*" /> <access origin="https://www.yourdomain.com/*" /> <access origin="tel:*" launch-external="yes" /> <access origin="http:*" launch-external="yes" /> <access origin="https:*" launch-external="yes" /> 

    Quando um URL é visitado no WebView, o Cordova viewificairá, em primeiro lugair, se as regras internas coincidirão e, em seguida, viewificairá se alguma das regras externas corresponde. Se nenhuma das regras internas corresponder, mas uma das regras externas corresponder, o URL será iniciado em uma Intenção.

    Isso funcionou muito bem paira mim, mas se você precisair de algo mais personalizado, descobri que o código paira processair isso está em CordovaUriHelper.java, na function shouldOviewrideUrlLoading. Então, se você quisesse personalizair isso um pouco, poderia fazer qualquer coisa.

    Na viewdade, o cairregamento do OviewrideUrl não é provável que funcione. Em vez disso, paira Android com SDK> = 11 você deve usair shouldInterceptRequest.

    O exemplo do webview deve ser o exemplo da intercepção

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.