Android, не может загружать изображения с помощью WebView

Я ищу решение на несколько дней для моей проблемы, но я не могу найти хороший. Поэтому я хотел спросить Здесь снова, прежде чем начать разработку родного приложения для Android, так как я не могу решить эту проблему.

Как говорится в заголовке, я пытаюсь загрузить изображение с помощью webview в html-контент, который обычно выбирает изображение, показывает его на странице и позволяет пользователю обрезать его. Я сделал все приложение и протестировал его на обычном браузере своего телефона, поэтому я не знал, что это woulnd не работать. Вот почему это чертовски расстраивает.

те решения, которые я нашел в Интернете не работают для моего Android и я читал, что это уже не возможно.

кто-нибудь знает, возможно ли это или нет? Было бы здорово помочь, если бы я мог получить больше информации об этом (даже если это возможно или нет?) Спасибо в Adavnce...

3 ответов


попробуйте добавить эти разрешения.

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

Android 6.0 Marshmallow представляет новую модель для обработки разрешения, которые упрощают процесс установки для пользователей и обновление приложений. При условии, что вы используете версию 8.1 или более поздней версии Google Play services, вы можете настроить приложение для целевой Android 6.0 Marshmallow SDK и используйте новую модель разрешений.

Если ваше приложение поддерживает новую модель разрешений, пользователь не иметь предоставление любых разрешений при установке или обновлении приложения. Вместо этого приложение должно запрашивать разрешения, когда оно в них нуждается время выполнения, и система показывает диалоговое окно пользователю, запрашивающему разрешение.

чтобы узнать больше, см. документацию для Android 6.0 Зефир и изменения, которые необходимо внести в приложение для новая модель разрешений.

Google добавила WebChromeClient.onShowFileChooser. Они даже предоставляют способ автоматического создания намерения выбора файла, чтобы он использовал входные типы MIME accept.

реализовать его таким образом (с ответ weiyin):

public class MyWebChromeClient extends WebChromeClient {
        // reference to activity instance. May be unnecessary if your web chrome client is member class.
    private MyActivity activity;

    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        // make sure there is no existing message
        if (myActivity.uploadMessage != null) {
            myActivity.uploadMessage.onReceiveValue(null);
            myActivity.uploadMessage = null;
        }

        myActivity.uploadMessage = filePathCallback;

        Intent intent = fileChooserParams.createIntent();
        try {
            myActivity.startActivityForResult(intent, MyActivity.REQUEST_SELECT_FILE);
        } catch (ActivityNotFoundException e) {
            myActivity.uploadMessage = null;
            Toast.makeText(myActivity, "Cannot open file chooser", Toast.LENGTH_LONG).show();
            return false;
        }

        return true;
    }
}


public class MyActivity extends ... {
    public static final int REQUEST_SELECT_FILE = 100;
    public ValueCallback<Uri[]> uploadMessage;

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if (requestCode == REQUEST_SELECT_FILE) {
                if (uploadMessage == null) return;
                uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
                uploadMessage = null;
            }
        }
    }
}

убедитесь, что скомпилировать приложение с API 21+. И это будет работать на всех платформах, как вы упоминаете на своем gradle.


здесь нет ответа на этот вопрос.. некоторые эксперты android люди дают решение для создания загрузки изображения в android-код.. это не тот вопрос, который вы задаете.. Меня беспокоит та же проблема.. То, что мы спрашиваем, - это страница HTML/PHP, которая загружается в приложение webview, не запускает приложение галереи или камеры, поскольку она запускает "загрузить файл с ПК" на настольном компьютере/ноутбуке в Mozilla или chrome.. Это похоже на паутину из iframe.. но внутри веб-просмотра android-приложения.. Думаю, я ясно выразился.. Мы не Android программисты мы веб-разработчики.

<form method="post" action="" enctype="multipart/form-data" name="form1">
<!-- this following input is not working in webview -->
<input size="25" name="file" type="file">
<input name="submit" type="submit" value="submit">
</form> 

Это метод работы от API 11 до 23

static WebView mWebView;
private ValueCallback<Uri> mUploadMessage;
public ValueCallback<Uri[]> uploadMessage;
public static final int REQUEST_SELECT_FILE = 100;
private final static int FILECHOOSER_RESULTCODE = 1;

теперь измените или переопределите метод onActivityResult

@Override
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(getActivity().getApplicationContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();

}

теперь в методе onCreate вставьте следующий код

mWebView.setWebChromeClient(new WebChromeClient()
{
// For 3.0+ Devices (Start)
// onActivityResult attached before constructor
protected void openFileChooser(ValueCallback uploadMsg, String acceptType)
{
    mUploadMessage = uploadMsg;
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("image/*");
    startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
}


// For Lollipop 5.0+ Devices
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(getActivity().getApplicationContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
        return false;
    }
    return true;
}

//For Android 4.1 only
protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
{
    mUploadMessage = uploadMsg;
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);
}

protected 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);
}
});