###実現したいこと
表題のエラーを直したいです。
WebViewでファイルのアップロードの実装中です。
アルバムから画像を選択するというところまでたどり着きましたが、選択した画像の読み込みが出来ません。そこで、onActivityResultを追加しましたが、表題のエラーが出てしまいます。(onActivityResult部分を追加するまでは正常に稼働します!)
自分見る限り、メソッドも正しく閉じられている気がするのですが、何故このようなエラーが起きるのでしょうか..。
###コード・エラーまでの経緯
現在はこの様なコードになっているます。画像の読み込みが出来ないため、onActivityResultメソッドを取り組みたいと思います。
java
1public class MainActivity extends AppCompatActivity { 2 private final static int FCR = 1; 3 private static final int INPUT_FILE_REQUEST_CODE = ; 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 webView.getSettings().setSupportZoom(true); 26 webView.getSettings().setBuiltInZoomControls(true); 27 if (Build.VERSION.SDK_INT >= 21) { 28 webSettings.setMixedContentMode(0); 29 webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 30 } else if (Build.VERSION.SDK_INT >= 19) { 31 webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 32 } else if (Build.VERSION.SDK_INT < 19) { 33 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 34 } 35 webView.setWebViewClient(new Callback()); 36 //webView.loadUrl("https://infeeds.com/"); 37 webView.loadUrl("https://google.com"); 38 39 webView.setWebChromeClient(new WebChromeClient() { 40 41 //For Android 3.0+ 42 public void openFileChooser(ValueCallback<Uri> uploadMsg) { 43 44 mUM = uploadMsg; 45 Intent i = new Intent(Intent.ACTION_GET_CONTENT); 46 i.addCategory(Intent.CATEGORY_OPENABLE); 47 i.setType("*/*"); 48 MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FCR); 49 } 50 51 // For Android 3.0+, above method not supported in some android 3+ versions, in such case we use this 52 public void openFileChooser(ValueCallback uploadMsg, String acceptType) { 53 54 mUM = uploadMsg; 55 Intent i = new Intent(Intent.ACTION_GET_CONTENT); 56 i.addCategory(Intent.CATEGORY_OPENABLE); 57 i.setType("*/*"); 58 MainActivity.this.startActivityForResult( 59 Intent.createChooser(i, "File Browser"), 60 FCR); 61 } 62 63 //For Android 4.1+ 64 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { 65 66 mUM = uploadMsg; 67 Intent i = new Intent(Intent.ACTION_GET_CONTENT); 68 i.addCategory(Intent.CATEGORY_OPENABLE); 69 i.setType("*/*"); 70 MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FCR); 71 } 72 73 //For Android 5.0+ 74 public boolean onShowFileChooser( 75 WebView webView, ValueCallback<Uri[]> filePathCallback, 76 WebChromeClient.FileChooserParams fileChooserParams) { 77 78 if (mUMA != null) { 79 mUMA.onReceiveValue(null); 80 } 81 82 mUMA = filePathCallback; 83 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 84 85 86 Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); 87 contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); 88 contentSelectionIntent.setType("*/*"); 89 Intent[] intentArray; 90 91 if (takePictureIntent != null) { 92 intentArray = new Intent[]{takePictureIntent}; 93 } else { 94 intentArray = new Intent[0]; 95 } 96 97 Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); 98 chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); 99 chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser"); 100 chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); 101 startActivityForResult(chooserIntent, FCR); 102 103 return true; 104 } 105 106 }); 107 108 } 109//↓ここからを追加した際にエラー発生 110//ここにonActivityResultコードを追加すると、、、 111//ここまで 112 public class Callback extends WebViewClient { 113 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 114 Toast.makeText(getApplicationContext(), "Failed loading app!", Toast.LENGTH_SHORT).show(); 115 } 116 } 117}
付け加えるonActivityResultメソッドは以下になります。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == INPUT_FILE_REQUEST_CODE) { ValueCallback mFilePathCallback; 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; } }
上記コードを付け加えると、INPUT_FILE_REQUEST_CODEがエラーになるため、
Create constant fieldをします。
そうすると下記の様に加えられますが、この時からビルドすると、表題のエラーが発生します。
よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー