MediaStore.Images.Media.insertImage возвращает ноль при попытке получить изображение URI - PullRequest
0 голосов
/ 24 декабря 2018

Мне нужно получить 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 return 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" />

и добавил разрешения времени выполнения для камеры и хранилища.

Iтакже добавили 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();
        }
    }
}

поэтому он создаст каталог, если не будет существовать, но это не помогло мне.

поэтому я публикую это здесь, может быть, я что-то упускаю, и кто-то может мне помочь.

1 Ответ

0 голосов
/ 24 декабря 2018

Так как вы говорите, что на некоторых устройствах возвращается 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();
        }
    }
}

Добавьте это к первому действию в вашем приложении.Это попросит пользователя предоставить разрешения, если они еще не предоставлены.

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