###実現したいこと
WebViewでファイルのアップロードの実装中です。アルバムから画像を選択するというところまでたどり着きましたが、選択した画像の読み込みが出来ません。そこで、onActivityResultを追加しました。現状ここまでは、正常に稼働します!
現状:onCreate → onShowFilleChooser → onAvtivityResult
しかし、選択された画像がアプリに読み込めていません。読み込みをできるようにして、アプリ内で画像のアップロードをできるようにしたいです。
###自分で取り組んだこと・考察
現状を考え、選択した画像をアプリに取得させるという部分が抜けているのかと想定しました。
様々なサイトをみる中で下記三点の考えに至っています。
・createImageFileが抜けている?
https://www.zidsworld.com/android-development/make-android-webview-support-file-upload/
https://kotaeta.com/57573104
・getResultUriが抜けている?
https://jq-jo.github.io/blog/2016/10/19/android-camera-gallery/
・特段上記二つは必要ないかもしれない?
https://www.petitmonte.com/java/android_webview_camera.html
しかし、この時点から一人では考察が伸びずにおります。
お分かりの方、是非お助け願います。
###コード
java
1public class MainActivity extends AppCompatActivity { 2 private final static int FCR = 1; 3 private static final int INPUT_FILE_REQUEST_CODE = 1; 4 WebView webView; 5 private String mCM; 6 private ValueCallback<Uri> mUM; 7 private ValueCallback<Uri[]> mUMA; 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 webView = findViewById(R.id.webview); 15 if (Build.VERSION.SDK_INT >= 23 && (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) { 16 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1); 17 } 18 assert webView != null; 19 20 WebSettings webSettings = webView.getSettings(); 21 webSettings.setJavaScriptEnabled(true); 22 webSettings.setAllowFileAccess(true); 23 webView.getSettings().setLoadWithOverviewMode(true); 24 webView.getSettings().setUseWideViewPort(true); 25 if (Build.VERSION.SDK_INT >= 21) { 26 webSettings.setMixedContentMode(0); 27 webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 28 } else if (Build.VERSION.SDK_INT >= 19) { 29 webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 30 } else if (Build.VERSION.SDK_INT < 19) { 31 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 32 } 33 webView.setWebViewClient(new Callback()); 34 webView.loadUrl("https://google.com"); 35 36 webView.setWebChromeClient(new WebChromeClient() { 37 38 //For Android 3.0+ 39 public void openFileChooser(ValueCallback<Uri> uploadMsg) { 40 41 mUM = uploadMsg; 42 Intent i = new Intent(Intent.ACTION_GET_CONTENT); 43 i.addCategory(Intent.CATEGORY_OPENABLE); 44 i.setType("*/*"); 45 MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FCR); 46 } 47 48 // For Android 3.0+, above method not supported in some android 3+ versions, in such case we use this 49 public void openFileChooser(ValueCallback uploadMsg, String acceptType) { 50 51 mUM = uploadMsg; 52 Intent i = new Intent(Intent.ACTION_GET_CONTENT); 53 i.addCategory(Intent.CATEGORY_OPENABLE); 54 i.setType("*/*"); 55 MainActivity.this.startActivityForResult( 56 Intent.createChooser(i, "File Browser"), 57 FCR); 58 } 59 60 //For Android 4.1+ 61 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { 62 63 mUM = uploadMsg; 64 Intent i = new Intent(Intent.ACTION_GET_CONTENT); 65 i.addCategory(Intent.CATEGORY_OPENABLE); 66 i.setType("*/*"); 67 MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FCR); 68 } 69 70 //For Android 5.0+ 71 public boolean onShowFileChooser( 72 WebView webView, ValueCallback<Uri[]> filePathCallback, 73 WebChromeClient.FileChooserParams fileChooserParams) { 74 75 if (mUMA != null) { 76 mUMA.onReceiveValue(null); 77 } 78 79 mUMA = filePathCallback; 80 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 81 82 83 Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); 84 contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); 85 contentSelectionIntent.setType("*/*"); 86 Intent[] intentArray; 87 88 if (takePictureIntent != null) { 89 intentArray = new Intent[]{takePictureIntent}; 90 } else { 91 intentArray = new Intent[0]; 92 } 93 94 Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); 95 chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); 96 chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser"); 97 chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); 98 startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE); 99 100 return true; 101 } 102 }); 103 } 104 @Override 105 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 106 if (requestCode == INPUT_FILE_REQUEST_CODE) { 107 ValueCallback mFilePathCallback = null; 108 if (mFilePathCallback == null) { 109 super.onActivityResult(requestCode, resultCode, data); 110 return; 111 } 112 Uri[] results = null; 113 114 // Check that the response is a good one 115 if (resultCode == RESULT_OK) { 116 String dataString = data.getDataString(); 117 if (dataString != null) { 118 results = new Uri[]{Uri.parse(dataString)}; 119 } 120 } 121 mFilePathCallback.onReceiveValue(results); 122 mFilePathCallback = null; 123 //return; 124 } 125 } 126 127 public class Callback extends WebViewClient { 128 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 129 Toast.makeText(getApplicationContext(), "Failed loading app!", Toast.LENGTH_SHORT).show(); 130 } 131 } 132} 133
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/16 12:24
2019/10/16 13:33