Cargando una URL dentro de un TXT en una vista Web

Estoy haciendo una especie de aplicación de navegador. Está funcionando como quiero, excepto por una cosa. Tengo que cargar una URL que está dentro de un .txt en mi WebView. El .txt estará en el directorio raíz del dispositivo y el usuario podrá editar este .txt utilizando la aplicación. ¿Cómo puedo hacerlo?

Activity_main.xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.abaco.abawser.MainActivity"> <WebView android:id="@+id/web" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> 

MainActivity.java:

 package com.abaco.awser; import android.app.ActionBar; import android.content.Intent; import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { WebView web; String webURL = "http://www.google.com"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); setContentView(R.layout.activity_main); getSupportActionBar().hide(); if (savedInstanceState != null) ((WebView)findViewById(R.id.web)).restoreState(savedInstanceState); web = (WebView) findViewById(R.id.web); web.loadUrl(webURL); web.setPadding(0, 0, 0, 0); web.getSettings().setLoadWithOverviewMode(true); web.getSettings().setUseWideViewPort(true); web.getSettings().setJavaScriptEnabled(true); this.web.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url){ view.loadUrl(url); return true; } }); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); web.saveState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); web.restoreState(savedInstanceState); } @Override public void onBackPressed() { } } 

Aquí hay dos preocupaciones separadas :

  1. Obtener una URL desde el archivo .txt
  2. Cargando una URL en WebView

Usted debe pensar en ellos por separado. Ya pareces saber cómo hacer 2. (cargar una URL en WebView ), así que enfócate en 1.

Puede aprender a abrir y leer un archivo en Java desde muchos recursos. Incluyendo SO . La única parte específica de Android es acceder al archivo. Las aplicaciones de Android tienen acceso restringido a la mayoría de las ubicaciones de almacenamiento. En los dispositivos de usuario (no enraizados), las aplicaciones tienen acceso a sólo unos pocos lugares:

Almacenamiento de aplicaciones

Cada aplicación puede acceder al almacenamiento propio (en /data/data/{your.package} ). Puede abrir estos archivos directamente con openFileInput . O obtener la ruta utilizando getFilesDir() .

Almacenamiento externo

Si el archivo está en /sdcard su aplicación necesitará el permiso READ_EXTERNAL_STORAGE y es posible que tenga que asegurarse de que el almacenamiento externo esté montado. Más información aquí .

/data/local/tmp

Esta es una ubicación en la mayoría de los dispositivos Android (pero no todos ) que todas las aplicaciones pueden "entrar", por lo que si coloca el archivo allí y asegúrese de que es legible en el mundo ( chmod o+r /data/local/tmp/myfile.txt ), Entonces podrás abrirlo en cualquier aplicación.

Me gustaría apoyar el enfoque de @szym. Aquí puede encontrar algún código para su mejor comprensión.

 File sdcard = Environment.getExternalStorageDirectory(); //Get the text file File file = new File(sdcard,"file.txt"); //Read text from file StringBuilder text = new StringBuilder(); try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; while ((line = br.readLine()) != null) { text.append(line); } br.close(); String url = ""; String urlRegex = "((https?|ftp|gopher|telnet|file):((//)|(\\\\))+[\\w\\d:#@%/;$()~_?\\+-=\\\\\\.&]*)"; Pattern pattern = Pattern.compile(urlRegex, Pattern.CASE_INSENSITIVE); Matcher urlMatcher = pattern.matcher(text.toString()); while (urlMatcher.find()) { url = text.toString().substring(urlMatcher.start(0), urlMatcher.end(0)); break; } if(""!=url){ WebView webview = (WebView) findViewById(R.id.webView1); webview.setWebViewClient(new WebViewClient()); webview.getSettings().setJavaScriptEnabled(true); webview.loadUrl(url); } } catch (IOException e) { //You'll need to add proper error handling here } 
  • ClassCastException durante el uso del servicio
  • Explicación clara del mensaje OutOfMemoryError
  • Cómo obtener un icono asociado con una cuenta específica de AccountManager.getAccounts ()
  • Extraer los valores de los parámetros de url android
  • Cómo mantener una versión gratuita y pagada de una aplicación
  • La biblioteca appcompat importada tiene errores
  • ¿Por qué el VoiceListener basado en Glass / GDK sólo captura VoiceCommand una vez en XE16?
  • Android: ¿Cómo iniciar la actividad desde el menú de preferencias?
  • ¿Es una buena práctica de programación usar campos estáticos de importación?
  • Obtener todas las carpetas google drive api en Android
  • Cifrado / descifrado de Android con AES
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.