В webView не работает кнопка которая расположена на сайте, кнопка отвечает за загрузку картинки.

Ответить
Ksantas
Сообщения: 2
Зарегистрирован: 12 ноя 2019, 01:00

В webView не работает кнопка которая расположена на сайте, кнопка отвечает за загрузку картинки.

Сообщение Ksantas » 12 ноя 2019, 01:20

В webView не работает кнопка которая расположена на сайте, кнопка отвечает за загрузку картинки. Примеров нашёл много но есть одно но мой webView расположен на фрагменте.
Вот мой код, может ли кто нибудь натолкнуть или помочь написать правильный код.
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"
    android:orientation="vertical"
    tools:context=".Fragments.Main">
    <View
        android:id="@+id/d1"
        android:layout_marginTop="5dp"
        android:layout_height="5dp"
        android:layout_marginBottom="5dp"
        android:layout_width="fill_parent"
        android:background="@drawable/css_orangefon"/>
    <WebView
        android:id="@+id/webView"
        android:layout_below="@+id/d1"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="RedundantNamespace" />
    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_centerInParent="true"
        android:indeterminateDrawable="@drawable/scaledrawable"
        android:visibility="visible" />
</RelativeLayout>
Main.java

Код: Выделить всё

package com.****.*******.*****.Fragments;
 
import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
 
import com.google.android.gms.common.internal.service.Common;
 
import com.****.*******.*****.R;
 
import static android.app.Activity.RESULT_OK;
 
 
public class Main extends Fragment {
    private ProgressBar progressBar;
 
    @SuppressLint("SetJavaScriptEnabled")
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.main, container, false);
        progressBar = rootView.findViewById(R.id.progressBar);
 
        final WebView mWebView = rootView.findViewById(R.id.webView);
        mWebView.setWebViewClient(new WebViewClient());
        //Для корректной работы браузера
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setDomStorageEnabled(true);
        mWebView.getSettings().setDefaultTextEncodingName("utf-8");
        mWebView.getSettings().setSupportZoom(true);
 
        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setUseWideViewPort(false);
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.getSettings().setDisplayZoomControls(false);
 
        mWebView.getSettings().setAllowFileAccess(true);
 
        //Нажатие на кнопку back (home) возвращения назад в фрагменте
        mWebView.canGoBack();
        mWebView.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK
                        && event.getAction() == MotionEvent.ACTION_UP
                        && mWebView.canGoBack()) {
                    mWebView.goBack();
                    return true;
                }
                return false;
            }
        });
        //Нажатие на кнопку back (home) возвращения назад в фрагменте
 
        mWebView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                progressBar.setVisibility(View.VISIBLE);
                progressBar.setProgress(progress);
                if (progress == 100) {
                    progressBar.setVisibility(View.GONE); // Make the bar disappear after URL is loaded
                }
            }
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
 
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
            }
            // For Android 3.0+
            public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                startActivityForResult(
                        Intent.createChooser(i, "File Browser"),
                        FILECHOOSER_RESULTCODE);
            }
 
            //For Android 4.1
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
 
            }
        });
        protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
            if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null == mUploadMessage) return;
                Uri result = intent == null || resultCode != RESULT_OK ? null
                        : intent.getData();
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
            }
        }
        progressBar.setVisibility(View.VISIBLE);
        mWebView.loadUrl("https://мой сайт");
        return rootView;
    }
}

Ksantas
Сообщения: 2
Зарегистрирован: 12 ноя 2019, 01:00

Re: В webView не работает кнопка которая расположена на сайте, кнопка отвечает за загрузку картинки.

Сообщение Ksantas » 14 ноя 2019, 15:01

Почти решил свою проблему, но теперь хочу чтобы можно было несколько выбрать картинок и выгрузить в моей вебВьёшке.

Вот на данный момент что я имею.

Код: Выделить всё

package com.Мой пакет.Fragments;

import android.annotation.SuppressLint;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Objects;

import com.Мой пакет.MainActivity;
import com.Мой пакет.*******.R;

public class Main extends Fragment {
    private ProgressBar progressBar;
    private ValueCallback<Uri> mUploadMessage;
    public ValueCallback<Uri[]> uploadMessage;
    public static final int REQUEST_SELECT_FILE = 100;
    private final static int FILECHOOSER_RESULTCODE=1;
    private TextView loading;

    @SuppressLint("NewApi")
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (requestCode == REQUEST_SELECT_FILE) {
                if (uploadMessage == null)
                    return;
                uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
                uploadMessage = null;
            }
        } else if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage)
                return;
            // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
            // Use RESULT_OK only if you're implementing WebView inside an Activity
            Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        } else
            Toast.makeText(Objects.requireNonNull(getActivity()).getApplicationContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();
    }

    @SuppressLint({"SetJavaScriptEnabled", "AddJavascriptInterface"})
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.main, container, false);
        progressBar = rootView.findViewById(R.id.progressBar);
        loading = rootView.findViewById(R.id.loading);

        final WebView mWebView = rootView.findViewById(R.id.webView);
        mWebView.setWebViewClient(new WebViewClient());
        //Для корректной работы браузера
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setDomStorageEnabled(true);
        mWebView.getSettings().setDefaultTextEncodingName("utf-8");
        mWebView.getSettings().setSupportZoom(true);

        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.getSettings().setDisplayZoomControls(false);

        mWebView.getSettings().setAllowFileAccess(true);

        //Нажатие на кнопку back (home) возвращения назад в фрагменте
        mWebView.canGoBack();
        mWebView.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK
                        && event.getAction() == MotionEvent.ACTION_UP
                        && mWebView.canGoBack()) {
                    mWebView.goBack();
                    return true;
                }
                return false;
            }
        });
        //Нажатие на кнопку back (home) возвращения назад в фрагменте

        mWebView.setWebChromeClient(new WebChromeClient() {

            //The undocumented magic method override
            //Eclipse will swear at you if you try to put @Override here
            // For Android 3.0+
            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                if (getActivity() != null) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("image/*");
                    getActivity().startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
                }
            }
            // For Android 3.0+
            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType ) {
                if (getActivity() != null) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("*/*");
                    getActivity().startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
                }
            }
            //For Android 4.1
            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
                if (getActivity() != null) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("image/*");
                    getActivity().startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
                }
            }

            // For Lollipop 5.0+ Devices
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]>
                    filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
            {
                if (uploadMessage != null) {
                    uploadMessage.onReceiveValue(null);
                    uploadMessage = null;
                }

                uploadMessage = filePathCallback;

                Intent intent = fileChooserParams.createIntent();
                try
                {
                    startActivityForResult(intent, REQUEST_SELECT_FILE);
                } catch (ActivityNotFoundException e)
                {
                    uploadMessage = null;
                    Toast.makeText(Objects.requireNonNull(getActivity()).getApplicationContext(),
                            "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
                    return false;
                }
                return true;
            }

            @SuppressLint("SetTextI18n")
            public void onProgressChanged(WebView view, int progress) {

                loading.setText("Идет загрузка ["+progress+"%], ожидайте...");
                System.out.println("progress "+progress);
                if (progress < 100 && loading.getVisibility() == TextView.GONE) {
                    progressBar.setVisibility(View.VISIBLE);
                    loading.setVisibility(TextView.VISIBLE);
                }
                if (progress == 100) {
                    progressBar.setVisibility(View.GONE);
                    loading.setVisibility(TextView.GONE);
                }
            }
        });
        progressBar.setVisibility(View.VISIBLE);
        loading.setVisibility(View.VISIBLE);
        mWebView.loadUrl("https://Мой сайт/");
        return rootView;
    }
}
Это рабочий код, только вот можно загрузить по одной картинке, и кстати как сделать чтобы он давал выбор камеры или галерее как в обычном браузере, и не перенаправлял сразу выбора картинки а предлагал с чего взять картинку либо с камеры либо с галереи, есть у кого нибудь мысли по поводу этого?

Ответить