Android Webiew не загружает индексированную SD-карту (файл: // sdcard)

#java #android #mobile #browser #webview

#java #Android #Мобильный #браузер #webview

Вопрос:

Когда я попытался получить доступ (файл: /// sdcard /) с помощью мобильных браузеров (например. Firefox, Opera .. и т. Д.). Он показывает мне страницу индекса для SD-карты (см. Скриншот).

введите описание изображения здесь

Однако, когда я получаю доступ к тому же URL-адресу с помощью webview и предоставляю ему разрешение на хранение, индексная страница не отображается. Мой код приведен ниже:

 package com.example.webbrowser;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.io.IOException;
import android.content.Context;
import android.net.ConnectivityManager;

import android.webkit.CookieManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;

class NetworkState {

    public static boolean connectionAvailable(Context context){

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return connectivityManager.getActiveNetworkInfo() !=null;
    }
}

class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        CookieManager.getInstance().setAcceptCookie(true);
        return true;
    }
}

public class MainActivity extends AppCompatActivity {

    WebView webView;
    EditText editText;
    ProgressBar progressBar;
    Button back, forward, stop, refresh, homeButton;
    Button goButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.web_address_edit_text);
        back = (Button) findViewById(R.id.back_arrow);
        forward = (Button) findViewById(R.id.forward_arrow);
        stop = (Button) findViewById(R.id.stop);
        goButton = (Button)findViewById(R.id.go_button);
        refresh = (Button) findViewById(R.id.refresh);
        homeButton = (Button) findViewById(R.id.home);
        progressBar = (ProgressBar) findViewById(R.id.progress_bar);
        progressBar.setMax(100);
        progressBar.setVisibility(View.VISIBLE);
        webView = (WebView) findViewById(R.id.web_view);

        if (savedInstanceState != null) {
            webView.restoreState(savedInstanceState);
        } else {
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setUseWideViewPort(true);
            webView.getSettings().setLoadWithOverviewMode(true);
            webView.getSettings().setSupportZoom(true);
            webView.getSettings().setSupportMultipleWindows(true);
            webView.getSettings().setAllowContentAccess(true);
            webView.getSettings().setAllowFileAccess(true);
            webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
            webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
            webView.setBackgroundColor(Color.WHITE);

            webView.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onProgressChanged(WebView view, int newProgress) {
                    super.onProgressChanged(view, newProgress);
                    progressBar.setProgress(newProgress);
                    if (newProgress < 100 amp;amp; progressBar.getVisibility() == ProgressBar.GONE) {
                        progressBar.setVisibility(ProgressBar.VISIBLE);
                    }
                    if (newProgress == 100) {
                        progressBar.setVisibility(ProgressBar.GONE);
                    }else{
                        progressBar.setVisibility(ProgressBar.VISIBLE);
                    }
                }
            });
        }

    }

    public void go_button(View view) {
        try {
            if(!NetworkState.connectionAvailable(MainActivity.this)){
                Toast.makeText(MainActivity.this, "Check connection", Toast.LENGTH_SHORT).show();
            }else {

                InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
                webView.loadUrl(editText.getText().toString());
                editText.setText("");
            }

        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void home_button(View view) {
        webView.loadUrl("https://google.com");
    }

    public void refresh_button(View view) {
        webView.reload();
    }

    public void stop_button(View view) {
        webView.stopLoading();
    }

    public void forward_button(View view) {
        if (webView.canGoForward()) {
            webView.goForward();
        }
    }

    public void back_button(View view) {
        if (webView.canGoBack()) {
            webView.goBack();
        }
    }
}
 

Android mainifest

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.webbrowser">

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.WebBrowser">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 

Любая помощь?

Комментарии:

1. I tried to access (file:///sdcard/) Ну, я не вижу этого URL в вашем коде…

2. На каком устройстве и версии Android Chrome и версия Chrome ведут себя подобным образом? Здесь этого не происходит.

3. проверьте последнюю версию. android 10 должен быть в порядке, вам нужно предоставить chrome разрешение на хранение @blackapps

4. Это не работает на моем устройстве Android 10. И file:/// sdcard по-прежнему отсутствует в вашем коде.

5. @blackapps код — это просто веб-просмотр, который получает URL-адрес из edittext (см. Эту строку) webView.loadUrl(editText.getText().toString()); при передаче URL-файла: /// sdcard после запуска он не будет работать. Кроме того, вы можете проверить URL-адрес в Chrome android 10 или 11 в эмуляторе Android. Это работает для меня на устройстве Samsung. При появлении запроса обязательно укажите разрешение на хранение.