![](/img/trans.png)
[英]MediaStore.Images.Media.insertImage returns null in some devices
[英]MediaStore.Images.Media.insertImage is returning null when trying to get image uri
我需要從圖像位圖獲取uri,所以我使用此方法獲取uri
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
fixMediaDir();
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
但是MediaStore.Images.Media.insertImage
在某些設備中返回null
注意 :我已經為清單添加了權限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
並添加了攝像機和存儲的運行時權限 。
我還在清單中添加了FileProvider
:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mvc.imagepicker.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="android:resource"/>
</provider>
請注意 ,提供程序上的權限是"com.mvc.imagepicker.provider"
因為我使用Mariovc / ImagePicker並使用了與他相同的權限。
我在其他帖子中看到,有人提到在致電之前要添加此代碼
MediaStore.Images.Media.insertImage
public void fixMediaDir() {
File sdcard = Environment.getExternalStorageDirectory();
Log.d("a111", "sdcard: "+sdcard);
if (sdcard != null) {
File mediaDir = new File(sdcard, "DCIM/Camera");
if (!mediaDir.exists()) {
mediaDir.mkdirs();
}
}
}
所以它會創建一個目錄,如果不存在的話,但這並沒有幫助我。
所以即時消息張貼在這里,也許我錯過了其他東西,有人可以幫助我。
由於您說的是在某些設備中返回null,因此我認為這是因為未提供權限。 在清單中設置權限僅指定所需的權限。 取決於設備或操作系統來授予它們。 在某些操作系統中,默認情況下不提供WRITE_EXTERNAL_STORAGE
和READ_EXTERNAL_STORAGE
。 嘗試這個:
private final String[] permissions = new String[]{Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
private static final int REQUEST_CODE = 12345; //Some random number
...
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
if (ActivityCompat.checkSelfPermission(SplashScreenActivity.this, permissions[0]) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(SplashScreenActivity.this, permissions[1]) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(SplashScreenActivity.this, permissions[2]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(SplashScreenActivity.this, permissions, REQUEST_CODE);
}
...
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults.length == 3 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(SplashScreenActivity.this, "Permission granted!!!", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(SplashScreenActivity.this, "Necessary permissions not granted...", Toast.LENGTH_LONG).show();
finish();
}
}
}
將此添加到您的應用程序中的第一個活動。 這將要求用戶授予權限(如果尚未提供)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.