Загрузка URL-адреса внутри TXT в Webview
Я делаю своеобразное приложение для браузера. Он работает так, как я хочу, кроме одного. Я должен загрузить URL-адрес, который находится внутри .txt
в моем WebView. .txt
будет в корневом каталоге устройства, и пользователь сможет отредактировать этот .txt
с помощью приложения. Как я могу это сделать?
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() {
}
}
Ответы
Ответ 1
Здесь есть две отдельные проблемы:
- Получение URL-адреса из файла .txt
- загрузка URL-адреса в
WebView
Вы должны думать о них отдельно. Вы уже знаете, как это сделать 2. (загрузите URL-адрес в WebView
), поэтому сосредоточьтесь на 1.
Вы можете узнать, как открывать и читать файл на Java из многих ресурсов. Включая fooobar.com/questions/10065/.... Единственная специальная часть Android - это доступ к файлу. Приложения для Android имеют ограниченный доступ к большинству мест хранения. На пользовательских (не корневых) устройствах приложения имеют доступ только к нескольким местоположениям:
Хранилище приложений
Каждое приложение может получить доступ к собственному хранилищу (в /data/data/{your.package}
). Вы можете открыть эти файлы напрямую, используя openFileInput
. Или получите путь, используя getFilesDir()
.
Внешнее хранилище
Если файл находится в /sdcard
, вашему приложению потребуется разрешение READ_EXTERNAL_STORAGE
, и вам, возможно, потребуется установить внешнее хранилище. Подробнее читайте здесь.
/data/local/tmp
Это одно место на большинстве Android-устройств (но не все), что все приложения могут "enter", поэтому, если вы поместите файл туда и убедитесь, что он доступен для чтения (chmod o+r /data/local/tmp/myfile.txt
) то вы сможете открыть его в любом приложении.
Ответ 2
Я хотел бы поддержать подход @szym. Здесь вы можете найти код для лучшего понимания.
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
}