У нас есть приложение, которое реализует WebView, и на странице можно загрузить файл (только изображения).
При нажатии На кнопке я могу выбрать приложение для получения фотографии.
На устройствах с Android 9 оно работает корректно как при выборе фотографии из приложения «Файлы», так и при съемке фотографии непосредственно с помощью камеры.
При Android 10, если я решу сделать фотографию, она не будет сохранена.
Анализируя журналы, мы заметили, что при использовании Android 10 генерируется следующая ошибка, поскольку Intent пуст.
java .io.FileNotFoundException: Нет поставщика контента
Из того, что мы знаем с Androdi 10 не должно быть никаких изменений.
Это случилось с кем-нибудь? Как вы решили это?
Спасибо за помощь
Обновление
Android 9 - Logcat
2020-03-03 10:46:23.083 6238-6238/com.natisoftnavigazione D/onActivityResult: requestCode:222
2020-03-03 10:46:23.083 6238-6238/com.natisoftnavigazione D/onActivityResult: resultCode:-1
2020-03-03 10:46:23.083 6238-6238/com.natisoftnavigazione D/onActivityResult: data:null
2020-03-03 10:46:23.083 6238-6238/com.natisoftnavigazione D/onActivityResult: mUploadMessage:null
2020-03-03 10:46:23.083 6238-6238/com.natisoftnavigazione D/onActivityResult: capturedImageUri:null
2020-03-03 10:46:23.083 6238-6238/com.natisoftnavigazione D/onActivityResult: IntentIntegrator.REQUEST_CODE:49374
2020-03-03 10:46:23.091 6238-6238/com.natisoftnavigazione D/uri_canc: uri_canc ->file:/storage/emulated/0/Pictures/JPEG_20200303_104617_6350370745326870992.jpg
Android 10 - Logcat
2020-03-03 13:06:52.329 2365-2365/com.natisoftnavigazione D/onActivityResult: requestCode:222
2020-03-03 13:06:52.329 2365-2365/com.natisoftnavigazione D/onActivityResult: resultCode:-1
2020-03-03 13:06:52.330 2365-2365/com.natisoftnavigazione D/onActivityResult: data:Intent { }
2020-03-03 13:06:52.330 2365-2365/com.natisoftnavigazione D/onActivityResult: mUploadMessage:null
2020-03-03 13:06:52.330 2365-2365/com.natisoftnavigazione D/onActivityResult: capturedImageUri:null
2020-03-03 13:06:52.330 2365-2365/com.natisoftnavigazione D/onActivityResult: IntentIntegrator.REQUEST_CODE:49374
2020-03-03 13:06:52.330 2365-2365/com.natisoftnavigazione D/uri_canc: uri_canc ->
2020-03-03 13:06:52.330 2365-2365/com.natisoftnavigazione D/onActivityResult - comp: java.io.FileNotFoundException: No content provider:
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: java.io.FileNotFoundException: No content provider:
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1673)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.content.ContentResolver.openInputStream(ContentResolver.java:1187)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at com.natisoftnavigazione.MainActivity.onActivityResult(MainActivity.java:697)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.app.Activity.dispatchActivityResult(Activity.java:8135)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.app.ActivityThread.deliverResults(ActivityThread.java:4838)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
2020-03-03 13:06:52.331 2365-2365/com.natisoftnavigazione W/System.err: at android.os.Handler.dispatchMessage(Handler.java:107)
2020-03-03 13:06:52.333 2365-2365/com.natisoftnavigazione W/System.err: at android.os.Looper.loop(Looper.java:214)
2020-03-03 13:06:52.334 2365-2365/com.natisoftnavigazione W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7356)
2020-03-03 13:06:52.334 2365-2365/com.natisoftnavigazione W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2020-03-03 13:06:52.334 2365-2365/com.natisoftnavigazione W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
2020-03-03 13:06:52.334 2365-2365/com.natisoftnavigazione W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
На обоих снимках экрана я сделал фотографию с помощью камеры, но при Android 10 фотография не сохраняется, и поэтому Intent пуст.
Этот метод вызывается кнопкой в HTML:
// For >= Android 5.0
public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) {
MainActivity mainActivity = ((MainActivity) getActivity());
// Double check that we don't have any existing callbacks
if (mainActivity.mUploadMessage2 != null) {
mainActivity.mUploadMessage2.onReceiveValue(null);
}
mainActivity.mUploadMessage2 = filePath;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(mainActivity.getPackageManager()) != null)
{
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
takePictureIntent.putExtra("PhotoPath", mainActivity.mCameraPhotoPath);
} catch (IOException ex) {
// Error occurred while creating the File
Log.d("onShowFileChooser", "Unable to create Image File", ex);
}
// Continue only if the File was successfully created
if (photoFile != null) {
mainActivity.mCameraPhotoPath = "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("image/*");
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, "Image Chooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
mainActivity.startActivityForResult(chooserIntent, ((MainActivity) getActivity()).INPUT_FILE_REQUEST_CODE);
return true;
}
В onActivityResult ошибка выдается во второй строке в перехвате попытки. Где uri_can c эквивалентно data.getDataString () (намерение передано в качестве входного параметра).
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Log.d("debug","Ho scelto la modalità per ottenere la foto -> " + data.toString());
//Log.d("debug","Ho scelto la modalità per ottenere la foto -> " + data.getType());
Log.d("onActivityResult", "requestCode:"+requestCode);
Log.d("onActivityResult", "resultCode:"+resultCode);
Log.d("onActivityResult", "data:"+data);
Log.d("onActivityResult", "mUploadMessage:"+mUploadMessage);
Log.d("onActivityResult", "capturedImageUri:"+capturedImageUri);
Log.d("onActivityResult", "IntentIntegrator.REQUEST_CODE:"+IntentIntegrator.REQUEST_CODE);
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
int livCompress = sharedPrefs.getInt("livCompress", 20);
//livCompress = 100 - livCompress;
if (requestCode==RESULT_SETTINGS)
{
caricaUserSettings();
}
else if(requestCode==FILECHOOSER_RESULTCODE)
{
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {...}
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (requestCode != INPUT_FILE_REQUEST_CODE || mUploadMessage2 == null) {
super.onActivityResult(requestCode, resultCode, data);
return;
}
Uri[] results = null;
String uri_canc = "";
// Check that the response is a good one
if (resultCode == Activity.RESULT_OK) {
if (data == null) {
// If there is not data, then we may have taken a photo
if (mCameraPhotoPath != null) {
results = new Uri[]{Uri.parse(mCameraPhotoPath)};
uri_canc = mCameraPhotoPath;
}
} else {
String dataString = data.getDataString();
if (dataString != null) {
results = new Uri[]{Uri.parse(dataString)};
uri_canc = dataString;
}
}
}
try {
Log.d("uri_canc", "uri_canc ->"+uri_canc);
InputStream ims = getContentResolver().openInputStream( Uri.parse(uri_canc) );
Bitmap bitmap = BitmapFactory.decodeStream(ims);
if(bitmap!=null) {
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
Calendar cal = Calendar.getInstance();
String extTmpFile = ".jpg";
String nameTmpFile = "img_compress_" + cal.getTimeInMillis();
File outputFile = File.createTempFile(nameTmpFile, extTmpFile, storageDir);
OutputStream os = new FileOutputStream(outputFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, livCompress, os);
os.flush();
os.close();
Uri ut = Uri.fromFile(outputFile);
results = new Uri[]{ut};
}
} catch (Exception e) {
Log.d("onActivityResult - comp", ""+e);
e.printStackTrace();
}
mUploadMessage2.onReceiveValue(results);
mUploadMessage2 = null;
}