最近我发现,由于新的运行时权限模型,我的应用程序不允许我选择图像并将其上传到Android 6.0 Marshmallow上的Amazon S3 。所以,我在我的活动(“添加图片”按钮收听)添加以下代码:Android 6.0和Amazon S3 SDK打开失败:EACCES(权限被拒绝)
if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.permlab_media_request)
.setMessage(R.string.permdesc_media_request)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
}
})
.create()
.show();
} else {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 0);
}
} else {
openPicker();
}
和本次活动实现了ActivityCompat.OnRequestPermissionsResultCallback
:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode != 0) {
return;
}
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openPicker();
}
}
此代码工作完美 - 权限对话框正在正确显示,如果用户允许应用程序访问外部存储,图像选择器将打开并在SD卡上显示可用图像。 然而,当我尝试使用此代码选择的图像上传到Amazon S3:
final TransferObserver transferObserver = mTransferUtil.upload(AmazonUtility.Constants.BUCKET_NAME, fileKey, file);
失败,并在日志中这样的消息:
E/UploadTask: Unable to calculate MD5 hash: /storage/0E17-2F07/Pictures/device-2015-12-03-184153.png: open failed: EACCES (Permission denied)
这些权限在清单中还宣称:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Amazon SDK限制访问外部SD卡的任何想法? 在具有较低API的设备上(< 23),所有这些代码均正常工作,文件成功上传。另外我想注意的是在Android 6.0的模拟器上运行这个应用程序。
在此先感谢!