'WebView Java Android Studio The application crashes when trying to attach a second file
I can't figure out what could be the reason. The photo is attached only 1 time, that is, I press the attach button, the photo is attached, I press it again - the application crashes ... Maybe someone can also tell me what code will help attach several images at once, now this is a maximum of one.
There is also an option to upload an image from the camera (should be). The camera opens, takes a photo and seems to attach, but nothing actually happens. And after pressing the button to attach a photo again, the application crashes, but this is more likely to the first part of the question.
public class MainActivity extends AppCompatActivity {
private MainActivity activity;
private WebView webView;
private UploadSupport uploadSupport;
private ValueCallback<Uri[]> mUMA;
private Uri uri;
private String mainPage = "*";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uploadSupport = new UploadSupport(MainActivity.this);
webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().getLoadWithOverviewMode();
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(
WebView view,
WebResourceRequest request
){
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public void onPageFinished(WebView view, String url) {
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
});
webView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
uploadSupport.showFileChooser(filePathCallback);
if (mUMA != null){
mUMA.onReceiveValue(null);
}
mUMA = filePathCallback;
return true;
}
@Override
public void onPermissionRequest(final PermissionRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
request.grant(request.getResources());
}
}
});
webView.loadUrl(mainPage);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode==UploadSupport.uploadCode){
if (grantResults.length>0&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
uploadSupport.showFileChooser(mUMA);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==UploadSupport.FCR){
if (uploadSupport.mUMA!=null){
uploadSupport.mUMA.onReceiveValue(parseResult(resultCode, data));
}
}
}
}
I use an additional class UploadSupport for file upload.
public class UploadSupport {
public ValueCallback<Uri> mUM;
public ValueCallback<Uri[]> mUMA;
public String mCM;
public static int FCR = 863;
public static int uploadCode = 9438162;
private Activity activity;
public UploadSupport(Activity activity){
this.activity = activity;
}
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUM = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
activity.startActivityForResult(Intent.createChooser(i, "File Chooser"), FCR);
}
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
mUM = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
activity.startActivityForResult(
Intent.createChooser(i, "File Browser"),
FCR);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mUM = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
activity.startActivityForResult(Intent.createChooser(i, "File Chooser"), FCR);
}
private File createImageFile() throws IOException {
@SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "img_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
return File.createTempFile(imageFileName, ".jpg", storageDir);
}
public void showFileChooser(ValueCallback<Uri[]> filePathCallback){
if (Build.VERSION.SDK_INT>=23){
if (ContextCompat.checkSelfPermission(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE)
==PackageManager.PERMISSION_GRANTED){
manageFileChooser(filePathCallback);
}else {
activity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},uploadCode);
}
}else {
manageFileChooser(filePathCallback);
}
}
private void manageFileChooser(ValueCallback<Uri[]> filePathCallback){
if (mUMA != null) {
mUMA.onReceiveValue(null);
}
mUMA = filePathCallback;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
takePictureIntent.putExtra("PhotoPath", mCM);
} catch (IOException exc) {
Log.e("TAG", "Image file creation failed", exc);
}
if (photoFile != null) {
mCM = "file:" + photoFile.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
} else {
takePictureIntent = null;
}
}
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("*/*");
Intent[] intentArray;
if (takePictureIntent != null) {
intentArray = new Intent[]{takePictureIntent};
} else {
intentArray = new Intent[0];
}
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
chooserIntent.putExtra(Intent.EXTRA_TITLE, "Choose an Action");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
activity.startActivityForResult(chooserIntent,FCR);
}
}
There is 2 errors in Logcat, after crash
A/chromium: [FATAL:jni_android.cc(306)] Please include Java exception stack in crash report
A/libc: Fatal signal 5 (SIGTRAP), code -6 (SI_TKILL) in tid 19063 (iesel.ru.java12), pid 19063
I would be very grateful if you tell me what is wrong or at least point me in the right direction.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
