Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Archivos locales de Android WebView + AJAX

Tengo una webview de Android cargando un sitio web que tengo localmente en mis activos. No lo he construido yo mismo, y tengo muy poco control sobre el marcado, js, etc.

Problema: Algunas partes del sitio web utilizan jQuery $ .ajax-consigue buscar HTML para mostrarlo en un modal, y creo que me he encontrado con un problema entre dominios (si pruebo el sitio localmente en mi escritorio, obtengo el mismo origen Es decir, por alguna razón el js local no puede ajax-obtener otros archivos locales en la carpeta de activos porque el navegador subyacente piensa que estos son de orígenes diferentes. He leído todo lo que puedo conseguir mis manos con respecto a esto, y nada parece hacer ninguna diferencia. No se producen errores o advertencias en LogCat.

Esto se está ejecutando en un Nexus 7, los archivos se encuentran en la carpeta de activos ( file:///android_asset ). Todo lo demás funciona bien, pero no hay suerte con el ajax GETs.

Del manifiesto:

 <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

Código webvista relevante:

 mWebView = (WebView) findViewById(R.id.webview); mWebView.setWebChromeClient(new WebChromeClient()); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setDomStorageEnabled(true); mWebView.getSettings().setLoadWithOverviewMode(true); mWebView.getSettings().setUseWideViewPort(true); mWebView.getSettings().setSupportMultipleWindows(true); mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); mWebView.setHorizontalScrollBarEnabled(false); mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); mWebView.getSettings().setAllowFileAccessFromFileURLs(true); mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); mWebView.addJavascriptInterface(this, "android"); if (savedInstanceState != null) { mWebView.restoreState(savedInstanceState); } else { mWebView.loadUrl("file:///android_asset/site/index.html"); } 

Aquí está el relevante js:

 var load = function ( source, callback, dontShowLoader ) { if( !dontShowLoader ) { loading( 'show' ); } $.ajax({ url: source, type: 'GET', data: { campaign: true }, success: function ( data ) { var $data = $(data); loading( 'hide' ); $data.data( 'url', source ); callback( $(data) ); } }); }; 

¿Me estoy perdiendo de algo? ¿Realmente no hay manera de hacer ajax GETs sobre el contenido del archivo local? Tenga en cuenta que sólo tengo los archivos locales para trabajar, caso de uso normal es que la tableta no está conectado a Internet cuando se utiliza la aplicación, por lo que las llamadas externas son un no-go.

  • ¿Hay una mejor vista web para Android
  • Cómo configurar el zoom / ancho inicial para una vista web
  • Cómo obtener el nombre de archivo al hacer clic en URL en la vista web
  • Android claro hilo webview, libre de memoria, evitar OutOfMemoryError
  • Eliminar espacio en blanco no deseado en WebView Android
  • ¿Hay una manera de pasar un mensaje de un navegador de Android a una aplicación?
  • Fling Gesture y Webview en Android
  • Cómo activar la cámara frontal en la vista web de android
  • 2 Solutions collect form web for “Archivos locales de Android WebView + AJAX”

    Debe permitir crossdomain. En este ejemplo, crossdomain está permitido para valores json y para scripts.

     $.ajaxPrefilter( "json script", function( options ) { options.crossDomain = true; }); 

    Gracias por la respuesta @ njzk2, lo he hecho:

     $.ajaxPrefilter( 'text', function( options ) { options.crossDomain = true; }); $.ajax({ url: source, type: 'GET', dataType: 'text' 

    Hacer que funcione en firefox, cromo e IE para cargar un archivo local (no a través de ningún servidor)

    Yo estaba personnaly falta de este parámetro que apuntan al api 16 al menos (preguntándose si cualquier otro parámetro podría apuntar a cualquier API más antigua)

     mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); 

    Gracias

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.