53942


いつもお世話になっております。  
Androidアプリの開発を行っており、webviewでloadしたページでファイルのアップロードを行いたいと思っております。

下記サイト

  1. [もう出ないなんて言わせないWebViewでファイルアップロードするダイアログの表示 - Qiita](https://qiita.com/futabooo/items/4706a0767c8ed2330752)
  2. [LollipopのWebViewでinput type fileで画像アップロード - Qiita](https://qiita.com/gokoku_h/items/2f92d73cd31e42307bf1)

などを参考に写真選択のダイアログが開くところまでは実装出来ているのですが、画像を選択しても`input`にそのファイルの情報がわたっていないようなのです。

[![選択されていません](https://i.stack.imgur.com/rPE53.png)](https://i.stack.imgur.com/rPE53.png)

上記の参考サイト1の`onActivityResult`で、`mFilePathCallback.onReceiveValue(results);`  
している箇所のresultsでは選択したファイルのURIが表示されている事は確認出来ております。  
もちろん、PHPだけでファイルが送信されている事は確認済みです。

原因がわからず、どなたか解決策をご存知でしたら、ご教授頂けますと幸いでございます。  
何卒、よろしくお願いいたします。

## 検証端末

  * Android 6
  * Android 8

## 検証ソース(抜粋)

upload.php

[code]

    <form action="/upload.php" method="post">
    <input type="file" name="image">
    <input type="submit">
    </form>
    <hr>
    <?php
    print_r($_FILES);
    ?>
    
[/code]

AndroidManifest.xml

[code]

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
[/code]

MainActivity.java

[code]

    final private int INPUT_FILE_REQUEST_CODE = 101;
    private ValueCallback<Uri[]> mFilePathCallback;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        WebView mWebView = (WebView) findViewById(R.id.main_webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setAppCacheEnabled(true);
        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.getSettings().setLoadWithOverviewMode(false);
        mWebView.getSettings().setDomStorageEnabled(true);
        mWebView.setWebChromeClient(new WebChromeClient() {
            // For Android 5.0+
            @Override
            public boolean onShowFileChooser(WebView webView,
                                             ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                if (mFilePathCallback != null) {
                    mFilePathCallback.onReceiveValue(null);
                }
                mFilePathCallback = filePathCallback;
    
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(intent, INPUT_FILE_REQUEST_CODE);
    
                return true;
            }
        });
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == INPUT_FILE_REQUEST_CODE) {
            if (mFilePathCallback == null) {
                super.onActivityResult(requestCode, resultCode, data);
                return;
            }
            Uri[] results = null;
    
            // Check that the response is a good one
            if (resultCode == RESULT_OK) {
                String dataString = data.getDataString();
                if (dataString != null) {
                    results = new Uri[]{Uri.parse(dataString)};
                }
            }
            Andrid.util.Log.d("tag", results[0]); // ← URIは取得出来ている
            mFilePathCallback.onReceiveValue(results);
            mFilePathCallback = null;
        }
    }
    
[/code]


CC BY-SA 4.0
2019-04-03T13:05:22.730
53894
2019-04-05T07:42:44.000
2019-04-03T16:06:35.270
3060
8755
question
android
Androidのwebviewでファイルが選択出来ない


自己解決いたしました。  
`onActivityResult` が動いたあとに、`onStart` が動くようで、`onStart`
でwebviewをloadを実行していたため、画面が再読込されてしまっていたようでした。  
簡素な画面で検証していたため、リロード処理も一瞬でなかなか気付けなかったのが原因でした。  
お手数をおかけいたしました。

参考サイト  
[onActivityResult
が呼ばれるタイミング](https://kokufu.blogspot.com/2012/09/onactivityresult.html)


CC BY-SA 4.0
2019-04-05T07:42:44.000
53942
2019-04-05T07:42:44.000
8755
53894
answer