2015-01-01 3 views
1

Я пытаюсь написать Bitmap в SD-карту (как Png файл), найти ниже КодексаНевозможно записать Bitmap в SD Card

File file = new File(getExternalFilesDir(null), "DemoFile.png"); 
OutputStream os = new FileOutputStream(file); 
Log.d("JS", "File name -> " + file.getAbsolutePath()); 
//File name -> /mnt/sdcard/Android/data/com.pocmodule/files/DemoFile.png 
bmp.compress(Bitmap.CompressFormat.PNG, 90, os); //here bmp is of type 'Bitmap' 
os.close(); 

Но я не вижу файла, «DemoFile.png» созданный на SD-карте. Не говоря уже о файле Png, я даже не вижу каталог «com.pocmodule», доступный на SD-карте.

Я ничего не теряю в своем коде?

+1

любое исключение или бревно? Может быть, у вас нет разрешения на запись? – Zielony

+1

«Но я не вижу файл« DemoFile.png », созданный на SD-карте. Не говоря уже о файле Png, я даже не вижу каталог« com.pocmodule », доступный на SD-карте» - как вы смотрите для этого? Проводник DDMS? ** 'adb shell ls' **? Что-то другое? Имейте в виду, что путь, который у вас есть в вашем комментарии, не обязательно находится там, где файл действительно находится в файловой системе, для Android 4.2+, как часть поддержки Android для нескольких учетных записей на устройство. – CommonsWare

+0

@CommonsWare, я монтирую свое устройство (с выбранным режимом отладки USB) и изучил каталог. Никогда не использовал DDMS (или) оболочку adb :(Будет ли полезно использовать DDMS (или) adb? (FYI, я использую Android Studio). «Имейте в виду, что путь, который у вас есть в вашем комментарии, не обязательно там, где файл фактически находится в файловой системе, для Android 4.2 "- Если Path не представляет точный путь в файловой системе, то как я могу проверить созданный файл? – Raj

ответ

2

монтирование устройства (с режимом отладки USB выбранного) и изучить каталог

Это не исследовать файловую систему. Он исследует то, что известно MediaStore.

Итак, первое, называют flush(), то getFD().sync(), на ваш FileOutputStream перед вызовом close() на него, чтобы убедиться, что все байты записываются на диск.

Затем используйте MediaScannerConnection и scanFile(), чтобы учить MediaStore о вашем файле.

Это может потребовать от вас что-то вроде «обновить» в окне проводника файла вашего рабочего стола, чтобы увидеть изменение или, возможно, даже отключить и снова подключить ваше устройство из-за того, что ОС Windows может кэшировать «каталог» "содержание.

+0

Hi @CommonsWare , Мне интересно об этом MediaScanner. Скажем, например, когда мы пишем файл на путь в ноутбуке (скажем, например, с помощью Java-программы), файл сразу же доступен в указанном пути. У нас нет этой концепции MediaStore Но почему в Android нам нужно научить MediaStore? Я действительно не хочу, чтобы этот файл был видимым для пользователя (который они могут просматривать через приложение Gallery) на своем устройстве. Просто хочу получить доступ к файлу из моего приложения для Android Не уверен, что мне не хватает некоторых основ. Любая ссылка или информация shoul d быть полезным – Raj

+0

@Raj: «У нас нет этой концепции MediaStore» - на самом деле, вы делаете. Протокол, переданный по USB-кабелю, является протоколом передачи мультимедиа (MTP). Что Android поддерживает MTP, это то, что индексируется «MediaStore». Когда настольная ОС * отправляет * файл через MTP, я подозреваю, что он немедленно индексируется «MediaStore». «Я действительно не хочу, чтобы этот файл был видимым для пользователя» - тогда почему вы кладете его на внешнее хранилище? ** определение ** внешнего хранилища - это «материал, который видим пользователю». – CommonsWare

+0

Спасибо @CommonsWare; что действительно помогает мне понять больше. На ваш вопрос - «зачем вы кладете его на внешнее хранилище», я на самом деле пытаюсь использовать файл расширения (файл «.obb» в моем случае представляет собой Zip-файл, содержащий несколько файлов изображений PNG); Я пытаюсь извлечь эти изображения (.png-файл) из файла .obb, сделайте некоторую оптимизацию и верните ее в тот же файл .obb. Поэтому изначально считалось, что нет смысла преподавать MediaStore. Но, как вы сказали, если это связано с USB Transfer; то обучение MediaStore становится необходимым – Raj

1

Спасибо @CommonsWare за помощью. У меня наконец есть файл Png, доступный на SD-карте :). Для тех, кто хочет знать рабочий код, пожалуйста, найдите ниже

File file = new File(getExternalFilesDir(null), "DemoFile.png"); 
FileOutputStream os = new FileOutputStream(file); 
    Log.d("JS", "File name -> " + file.getAbsolutePath()); 
    //Here 'bmp' is of type Bitmap 
    bmp.compress(Bitmap.CompressFormat.PNG, 90, os); 
    os.flush(); 
    os.getFD().sync(); 
    os.close(); 

    MediaScannerConnection.scanFile(this, 
      new String[]{file.toString()}, null, 
      new MediaScannerConnection.OnScanCompletedListener() { 
       public void onScanCompleted(String path, Uri uri) { 
        Log.i("ExternalStorage", "Scanned " + path + ":"); 
        Log.i("ExternalStorage", "-> uri=" + uri); 
       } 
      }); 
+0

http://stackoverflow.com/questions/32127869/cant-create-anything-on-sdcard-or-load-an-image-from-it У меня такая же проблема, но я ничего не могу сделать много пробовал, но все же не мог написать что-нибудь на sd –

Смежные вопросы