在Android 10的Scoped Storage中,你需要使用特定的URI来访问外部存储的文件。以下是一个解决方法,可以在ACTION_VIEW中显示外部存储的图像。
首先,在AndroidManifest.xml文件中添加以下权限:
然后,在你的代码中,你需要使用MediaStore
类来获取外部存储文件的URI。以下是一个示例代码:
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_CODE = 1;
private static final int PICK_IMAGE_REQUEST_CODE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查权限
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSION_REQUEST_CODE);
}
}
public void openImage(View view) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予
// 在这里执行需要权限的操作
} else {
// 权限被拒绝
// 在这里处理权限被拒绝的情况
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {
if (data != null) {
Uri uri = data.getData();
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
viewIntent.setDataAndType(uri, "image/*");
viewIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(viewIntent);
}
}
}
}
在上面的代码中,当用户点击一个按钮时,会打开一个选择图像的文件浏览器。用户选择图像后,会获取到图像的URI,并使用ACTION_VIEW来打开图像。在打开图像的Intent中,我们需要添加FLAG_GRANT_READ_URI_PERMISSION标志,以便在Scoped Storage中授予读取URI的权限。
请确保在获取到权限后再执行需要权限的操作,否则可能会导致异常。