いつもお世話になっております。
早速ですがWebViewのアプリを作成しておりますが、バージョン4.4.4のタブレットで、input type=fileに画像をアップロードしようとしたところ一度しか呼ばれない、かつ画像が反映されない不具合が発生しています。
色々調べたところ下記のURLでGoogleが対応していないという記事を見つけました。
URL:https://sakura-bird1.hatenablog.com/entry/2016/06/23/234306
この記事ではJavaScriptInterfaceかChromiumエンジンを使用して対応できると書いてあるのですが、自分の場合一度は選択できるので一度選択したら二度は入らないみたいなプログラムになっているのかなと感じています。
もしそうだった場合上記以外のやり方でやりたいと思っております、(工程が長いため)
上記のやり方も試していない状況でお聞きするのは失礼だとは存じますが、既存のやり方でできる方法はありますでしょうか?
下記コードはinput file で開かれる処理です。
足りなければ追記いたします。
private ValueCallback<Uri> mUploadMessage; private final static int FILECHOOSER_RESULTCODE=1; //バージョン5以上対象 public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { //カメラ・ストレージの許可が取れていない場合中に入る if (PermissionChecker.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && PermissionChecker.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { //mFilePathCallback if (mFilePathCallback != null) { mFilePathCallback.onReceiveValue(null); } mFilePathCallback = filePathCallback; mCameraPhotoPath = null; Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { //プライマリ共有/外部ストレージの宣言 String filename = Environment.getExternalStorageDirectory() + "/dummy.jpg"; //デファルトの初期サイズを宣言 ContentValues values = new ContentValues(); //valueに値をセット values.put(MediaStore.Images.Media.TITLE, filename); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); Uri uri = getActivity().getApplicationContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); UriList.add(uri); // INIファイルにURIリストの情報を書き込む for (int i = 0; i < UriList.size(); i++) { editor.putString("uri" + i, UriList.get(i).toString()); } editor.putInt("count", UriList.size()); editor.apply(); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri); mCameraPhotoPath = uri.toString(); } Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); contentSelectionIntent.setType("image/*"); contentSelectionIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); Intent[] intentArray; if (takePictureIntent != null) { intentArray = new Intent[]{takePictureIntent}; } else { intentArray = new Intent[0]; } chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); chooserIntent.putExtra(Intent.EXTRA_TITLE, "画像ファイルを選択"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE); return true; } else { //メソッド パーミッションチェック読み込み permissionCheck(); return false; } } // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg) { Log.d("","入りました! ver 3"); mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); WebagreView.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE); } // For Android 3.0+ public void openFileChooser( ValueCallback uploadMsg, String acceptType ) { Log.d("","入りました! ver 3+"); mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("*/*"); WebagreView.this.startActivityForResult( Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE); } <!--タブレット4.4.4で入っている箇所--> //For Android 4.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){ Log.d("","入りました! ver 4.1"); mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); //送付するタイプは画像 i.setType("image/*"); WebagreView.this.startActivityForResult( Intent.createChooser( i, "ファイル選択が間違っています。" ), WebagreView.FILECHOOSER_RESULTCODE ); }
//カメラ・ストレージ表示 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("","requestCode" + requestCode); Log.d("","resultCode" + resultCode); Log.d("","INPUT_FILE_REQUEST_CODE" + INPUT_FILE_REQUEST_CODE); Log.d("","mFilePathCallback" + mFilePathCallback); if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) { super.onActivityResult(requestCode, resultCode, data); return; } Uri[] results = null; //4.4.4のタブレットが入るところ if(requestCode==FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); mUploadMessage.onReceiveValue(result); mUploadMessage = null; } if (resultCode == RESULT_OK) { if (data == null) { if (mCameraPhotoPath != null) { // カメラ results = new Uri[]{Uri.parse(mCameraPhotoPath)}; } } else { String dataString = data.getDataString(); if (dataString != null) { // 単一選択 results = new Uri[]{Uri.parse(dataString)}; } else { ClipData clipData = data.getClipData(); if (clipData == null) { // カメラ results = new Uri[]{Uri.parse(mCameraPhotoPath)}; } else { // 複数選択 results = new Uri[clipData.getItemCount()]; for (int i = 0; i < clipData.getItemCount(); i++) { results[i] = clipData.getItemAt(i).getUri(); } } } } } mFilePathCallback.onReceiveValue(results); mFilePathCallback = null; return; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。