[当我尝试将图像发送到服务器时,出现错误。在装有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
库为空
我的活动:
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
[随着每个新的Android版本,Google都使使用Java- File
类变得更加困难/不可能。 Google希望您将contentprovider与InputStream
或OutputStream
一起使用。
如果从图库或图像选择器中获取崩溃堆栈跟踪的照片“ / storage / emulated / 0 / WhatsApp / Media / WhatsApp Images / IMG-20200527-WA0000.jpg”,请使用原始的“内容:... 。“ uri并通过
加载图像context.getContentResolver()。openInputStream(contentUri);
更新:
库'com.fxn769:pix'= https://github.com/akshay2211/PixImagePicker。目前在android-10上无法正常使用:请参见https://github.com/akshay2211/PixImagePicker/issues/103
[从android-4.4开始的android方式选择图像是
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),
PICK_IMAGE);
您可以通过contentresolver打开的onActivityResult中的“ content:-uri”]