質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.25%

  • Android

    5363questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    2859questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

android7で、Webview経由のギャラリーからの写真取得が出来ない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 61

hiroppii

score 28

前提・実現したいこと

android7 で、Webview経由のギャラリーからの写真取得をしたいと思っています。
ご教授いただけると助かります。
sdkを25に落とせば、うまく動作するのですが26にするとボタンを押した途端にアプリが落ちてしまいます。

発生している問題・エラーメッセージ

inputボタンを押すと同時にアプリが落ちてしまいます。

01-10 22:18:31.563 27429-27429/? E/PPDaemon: Cannot open backlight
01-10 22:18:32.253 27439-27439/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: com.android.documentsui, PID: 27439
                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.android.documentsui.model.RootInfo.equals(java.lang.Object)' on a null object reference
                                                       at com.android.documentsui.BaseActivity.onRootPicked(BaseActivity.java:250)
                                                       at com.android.documentsui.DocumentsActivity.onRootPicked(DocumentsActivity.java:327)
                                                       at com.android.documentsui.DocumentsActivity$LoadLastUsedStackTask.finish(DocumentsActivity.java:537)
                                                       at com.android.documentsui.DocumentsActivity$LoadLastUsedStackTask.finish(DocumentsActivity.java:533)
                                                       at com.android.documentsui.PairedTask.onPostExecute(PairedTask.java:75)
                                                       at android.os.AsyncTask.finish(AsyncTask.java:667)
                                                       at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                       at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:684)
                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                       at android.os.Looper.loop(Looper.java:154)
                                                       at android.app.ActivityThread.main(ActivityThread.java:6173)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
01-10 22:18:36.629 27528-27528/? E/PPDaemon: Cannot open backlight
01-10 22:18:41.693 27603-27603/? E/PPDaemon: Cannot open backlight
01-10 22:18:45.756 27661-27661/? E/PPDaemon: Cannot open backlight
01-10 22:18:50.831 27733-27733/? E/PPDaemon: Cannot open backlight
01-10 22:18:55.893 27790-27790/? E/PPDaemon: Cannot open backlight
01-10 22:19:00.095 17168-17168/? E/DigitalWidget_Service: WidgetUpdateReceiver__action=android.intent.action.TIME_TICK
01-10 22:19:00.099 4092-7644/? E/ActivityManager: Sending non-protected broadcast zte.widget.action.TimeWidgetUpdate from system 17168:com.android.deskclock/1000 pkg com.android.deskclock
                                                  java.lang.Throwable
                                                      at com.android.server.am.ActivityManagerService.checkBroadcastFromSystem(ActivityManagerService.java:18241)
                                                      at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:18813)
                                                      at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:18904)
                                                      at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:499)
                                                      at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2899)
                                                      at android.os.Binder.execTransact(Binder.java:565)
01-10 22:19:00.119 17168-17168/? E/DigAppWidgetProvider: zhanghui __ updateTime:22:19
01-10 22:19:00.133 17168-17168/? E/AlarmClock: getShowHomeClock() homeTimeZone=libcore.util.ZoneInfo[id="Asia/Tokyo",mRawOffset=32400000,mEarliestRawOffset=32400000,mUseDst=false,mDstSavings=0,transitions=9]
01-10 22:19:00.955 27867-27867/? E/PPDaemon: Cannot open backlight
01-10 22:19:03.507 20078-20080/? E/QC-QMI: qmi_client [20078] d5: failed to locate client data
01-10 22:19:03.508 3087-3087/? E/QC-DS-LIB: qmuxd: RX on fd=14 returned error=0 errno[2:No such file or directory]
01-10 22:19:03.508 3087-3087/? E/QC-QMI: QMUX qmux_client_id=d5 not found in qmux client list, unable to remove
01-10 22:19:03.553 27910-27910/? E/Diag_Lib:  Diag_LSM_Init: Failed to open handle to diag driver, error = 13
01-10 22:19:06.577 27955-27955/? E/PPDaemon: Cannot open backlight

該当のソースコード

<form method="post" action="text.php" enctype="multipart/form-data">

    <input type="file" name="ファイル選択"></p>

    <p><input type="submit" value="送信"></p>

</form>
    private ValueCallback<Uri> mUploadMessage;
    private ValueCallback<Uri[]> mFilePathCallback;
    final private int FILECHOOSER_RESULTCODE = 1;

    // ファイル選択機能を有効にし、ギャラリーから画像を所得
    webView.setWebChromeClient(new WebChromeClient() {
        // For Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadFile) {
            openFileChooser(uploadFile, "");
        }

        // For 3.0 <= Android < 4.1
        public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) {
            openFileChooser(uploadFile, acceptType, "");
        }

        // For 4.1 <= Android < 5.0
        public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) {
            if (mUploadMessage != null) {
                mUploadMessage.onReceiveValue(null);
            }
            mUploadMessage = uploadFile;

            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("image/*");

            startActivityForResult(intent, FILECHOOSER_RESULTCODE);
        }

        // 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, FILECHOOSER_RESULTCODE);

            return true;
        }
    });

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // ギャラリーから写真取得後の処理
        if (requestCode != FILECHOOSER_RESULTCODE) {
            super.onActivityResult(requestCode, resultCode, data);
            return;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            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)};
                }
            }

            mFilePathCallback.onReceiveValue(results);
            mFilePathCallback = null;
        } else {
            if (mUploadMessage == null) {
                super.onActivityResult(requestCode, resultCode, data);
                return;
            }

            Uri result = null;

            if (resultCode == RESULT_OK) {
                if (data != null) {
                    result = data.getData();
                }
            }

            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;

            webView.clearCache(true);
        }
    }

試したこと

sdkを25に落とせば、うまく動作するのですが26にするとボタンを押した途端にアプリが落ちてしまいます。

補足情報(言語/FW/ツール等のバージョンなど)

androidstudio2.2/sdk26

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hiramekun

    2018/01/04 20:14

    落ちる場合はその際のエラーメッセージを追記してください

    キャンセル

  • hiroppii

    2018/01/10 18:43 編集

    回答ありがとうございます。ご連絡がおくれてすみません。 エラーメッセージですが、「ファイルが停止しました。アプリを再起動」と出ます。

    キャンセル

回答 1

check解決した方法

0

下記のように書き換えたら、うまく動作してくれました。

// 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, FILECHOOSER_RESULTCODE);

return true;
}

↓↓↓

// For Android 5.0+
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (mFilePathCallback != null) {
mFilePathCallback.onReceiveValue(null);
}
mFilePathCallback = filePathCallback;

//暗黙的Intentを使ってギャラリーアプリを選択し、画像のURIを取得
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);

return true;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.25%

関連した質問

同じタグがついた質問を見る

  • Android

    5363questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    2859questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。