Android: decodeFile всегда возвращает ноль для файла во внутренней памяти - PullRequest
17 голосов
/ 16 мая 2011

У меня есть файл, сохраненный локально в личном хранилище приложения.Я подтвердил, что он существует, однако всякий раз, когда я вызываю BitmapFactory.decodeFile, он всегда возвращает ноль.

Если я сохраняю файл как ресурс и использую ImageView setImageResource, он всегда отображается нормально.

Чтоэто проблема?

Вот фрагмент:

filename = "test.png";

if (doesFileExist(filename))
    Bitmap bMap = BitmapFactory.decodeFile(filename);

Я также пробовал:

Bitmap bMap = BitmapFactory.decodeFile(getFilesDir().getPath()
                    + filename);

Ответы [ 6 ]

30 голосов
/ 16 мая 2011

На этот вопрос уже был дан ответ, например здесь: BitmapFactory.decodeFile возвращает ноль, даже если изображение существует

Это было именно то, что мне было нужно:

String fname=new File(getFilesDir(), "test.png").getAbsolutePath();
3 голосов
/ 16 мая 2011

Люди, файлы, хранящиеся в ресурсе приложения, должны указываться особым образом.Например, если файл находится в ресурсах и называется «myfile.png», на него следует ссылаться как:

String uriString="file:///android_asset/myfile.png";
Uri uri=Uri.parse(uriString);
2 голосов
/ 22 октября 2018

BitmapFactory.decodeFile ожидает путь к файлу без схемы. То есть без file:// в начале.

Если вы обрабатываете Uri, не просто .toString(), а вызовите .getPath() и передайте его методу.

2 голосов
/ 21 сентября 2016

Вместо использования BitmapFactory.decodeFile, попробуйте использовать InputStream:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    if(resultCode == RESULT_OK){          
        Uri selectedImage = imageReturnedIntent.getData();
        InputStream imageStream = getContentResolver().openInputStream(selectedImage);
        Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
0 голосов
/ 03 мая 2017

Для меня я получал изображение с локально сохраненного URL-адреса, например, «file: /// storage / emulated / 0 / ....» (я использовал плагин Phonegap для захвата изображения. Плагин давал мне путь к изображению, который Мне нужно использовать в нативном коде)

Вот фрагмент кода, который работал для меня.

String captured_image_info = "file:///storage/emulated/0/Android/data/com.testapp/cache/1493809796526.jpg"
Uri uri=Uri.parse(captured_image_info);
largeLog("uri", "" + uri);

InputStream imageStream = getContentResolver().openInputStream(uri);

Bitmap bm = BitmapFactory.decodeStream(imageStream);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object

byte[] decodedBytes = baos.toByteArray();

Bitmap img_captured_image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
0 голосов
/ 16 мая 2011

Не могли бы вы попробовать fileList ()?Он

возвращает массив строк с именами личных файлов, связанных с пакетом приложения этого контекста.

...