web-dev-qa-db-ja.com

Android、WebViewを使用して画像をアップロードできません

私は自分の問題の解決策を数日間探していますが、良いものを見つけることができません。そのため、この問題を解決できないため、Androidのネイティブアプリの開発を開始する前に、ここでもう一度質問したいと思いました。

タイトルが示すように、私はWebviewを使用して、通常は画像を選択し、ページに表示してユーザーがトリミングできるようにするhtmlコンテンツに画像をアップロードしようとしています。私はアプリ全体を作成し、携帯電話の通常のブラウザーでテストしたので、これが機能しないことを知りませんでした。だからそれはとてもイライラします。

私がインターネットで見つけたこれらの解決策は私のAndroidで機能していません、そして私はそれがもう不可能であると読みました。

これが可能かどうか誰かが知っていますか?これについてもっと多くの情報を得ることができれば(それが可能かどうかにかかわらず)、それは大きな助けになるでしょう。Adavnceに感謝します...

6
yadbo

これらの権限を追加してみてください。

<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は、権限を処理するための新しいモデルを導入しました。これにより、ユーザーがアプリをインストールおよびアップグレードする際のプロセスが合理化されます。 Google Play開発者サービスのバージョン8.1以降を使用している場合は、Android 6.0 Marshmallow SDKをターゲットにして、新しい権限モデルを使用するようにアプリを構成できます。

アプリが新しい権限モデルをサポートしている場合、ユーザーはアプリをインストールまたはアップグレードするときに権限を付与する必要はありません。代わりに、アプリは実行時に必要なときにアクセス許可を要求する必要があり、システムはユーザーにアクセス許可を求めるダイアログを表示します。

詳細については、 Android 6.0 Marshmallow のドキュメントと、 新しい権限モデル のためにアプリに加える必要のある変更を参照してください。

Googleは WebChromeClient.onShowFileChooser を追加しました。また、ファイルチューザーインテントを自動的に生成して、入力受け入れmimeタイプを使用する方法も提供します。

このように実装します( weiyinによる回答 から):

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

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

必ずAPI21以降でアプリをコンパイルしてください。そして、これは、gradleで言及したように、すべてのプラットフォームで機能します。

9
Sibidharan

これは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);
}
});
3
Rishab

ここで問題に対処している答えはありません..一部の専門家Android人々は画像のアップロードをAndroidコードに組み込むためのソリューションを提供しています..それはこの質問ではありません..私は私を悩ませている同じ問題を抱えています..私たちが求めているのは、WebviewアプリにロードされたHTML/PHPページが、Mozillaのデスクトップコンピューター/ラップトップで「PCからのファイルのアップロード」をトリガーするため、ギャラリーまたはカメラアプリをトリガーしないことですまたはクロム..それはiframeの種類のものからのウェブのようなものです..しかし内部Androidアプリのウェブビュー..私はそれを明確にしたと思います..私たちはAndroid私たちがWeb開発者であるプログラマー。

<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> 
3
Panjab Web