Android 10 в разрешении отказано - PullRequest
1 голос
/ 28 мая 2020

Когда я пытаюсь отправить изображение на сервер, я получаю сообщение об ошибке. На аппарате с Android 6 и Android 9 все работает нормально. Но когда я использую устройство с эмулятором Android 10 или BlueStacks 4, я получаю сообщение об ошибке. Мой манифест выглядит так:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Я также пробовал добавить в манифест следующий тег: android:requestLegacyExternalStorage="true", но моя проблема остается. В журналах я получаю сообщение об ошибке, что библиотека Compressor получает null

My Activity:

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

        when (requestCode) {
            PermUtil.REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS -> {
                if (grantResults.isEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Pix.start(this, Options.init().setRequestCode(100));
                } else {
                    ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL)
                    Toast.makeText(
                        this, "Approve permissions to open Pix ImagePicker",
                        Toast.LENGTH_LONG).show();
                }
            }
        }
    }

// Функция, вызывающая ошибку

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {

            Constants.ACTION_REQUEST_CAMERA ->{
                if (resultCode == Activity.RESULT_OK){

                    returnValue = data!!.getStringArrayListExtra(Pix.IMAGE_RESULTS)!!

                        val f = File(returnValue[0])
                        photoFile = Compressor(this).compressToFile(f)

                    Toast.makeText(this, f.toString(), Toast.LENGTH_LONG).show()
                }
            }
        }
    }

Logcat :

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.foodstationapp/com.example.foodstationapp.activities.RegisterActivity}: java.io.FileNotFoundException: /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200527-WA0000.jpg: open failed: EACCES (Permission denied)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4905)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4946)
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7520)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.io.FileNotFoundException: /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20200527-WA0000.jpg: open failed: EACCES (Permission denied)
    at libcore.io.IoBridge.open(IoBridge.java:496)
    at java.io.FileInputStream.<init>(FileInputStream.java:159)
    at java.io.FileInputStream.<init>(FileInputStream.java:115)
    at android.media.ExifInterface.initForFilename(ExifInterface.java:2297)
    at android.media.ExifInterface.<init>(ExifInterface.java:1386)
    at id.zelory.compressor.ImageUtil.decodeSampledBitmapFromFile(ImageUtil.java:60)
    at id.zelory.compressor.ImageUtil.compressImage(ImageUtil.java:33)
    at id.zelory.compressor.Compressor.compressToFile(Compressor.java:60)
    at id.zelory.compressor.Compressor.compressToFile(Compressor.java:56)
    at com.example.foodstationapp.activities.RegisterActivity.onActivityResult(RegisterActivity.kt:268)
    at android.app.Activity.dispatchActivityResult(Activity.java:8249)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4898)
    ... 11 more
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
    at libcore.io.Linux.open(Native Method)
    at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252)
    at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
    at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7419)
    at libcore.io.IoBridge.open(IoBridge.java:482)
    ... 22 more

1 Ответ

0 голосов
/ 28 мая 2020

С каждой новой версией Android Google усложняет / делает невозможным использование класса java - File. Google хочет, чтобы вы использовали Contentprovider с InputStream или OutputStream.

Если вы получили фотографию своего cra sh -stacktrace "/ storage / emulated / 0 / WhatsApp / Media / WhatsApp Images / IMG-20200527-WA0000.jpg" из галереи или средства выбора изображений, используйте исходный uri "content: ...." и загрузить изображение через

context.getContentResolver (). openInputStream (contentUri);


update:

library 'com.fxn769: pix' = https://github.com/akshay2211/PixImagePicker. В настоящее время он больше не работает на android -10: см. https://github.com/akshay2211/PixImagePicker/issues/103

Способ android (начиная с android -4.4) для выбора изображения -

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),
       PICK_IMAGE);

, где вы получаете «content:» - uri в onActivityResult, который можно открыть через contentresolver

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...