Выберите Файл - java .io.FileNotFoundException: Нет поставщика контента. - PullRequest
0 голосов
/ 02 марта 2020

У нас есть приложение, которое реализует WebView, и на странице можно загрузить файл (только изображения).

enter image description here

При нажатии На кнопке я могу выбрать приложение для получения фотографии.

На устройствах с Android 9 оно работает корректно как при выборе фотографии из приложения «Файлы», так и при съемке фотографии непосредственно с помощью камеры.

При Android 10, если я решу сделать фотографию, она не будет сохранена.

enter image description here

Анализируя журналы, мы заметили, что при использовании 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;
        }
...