Подтвердить что ты не робот

Загрузка 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() {
    }

}
4b9b3361

Ответ 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
}