В течение нескольких недель мы сталкиваемся с проблемой, которая обсуждалась ранее в SO, но без рабочего ответа в конкретном случае, с которым мы столкнулись. Поэтому, перечитав десятки потоков и попробовав всех пользователей кода, я прошу вас о помощи, пожалуйста. (Кстати, забудьте просят Samsung: они оказались гораздо меньше, чем полезно.)Файл Samsung io - может записывать файл, но не читать обратно
OS: 4.0.x через 4.2.x (API LVLS 14 - 17)
Devices: Samsung S3 которые имеют/хранение/sdcard0 (все мы протестировали делают.)
... в отличие от старшего /мнта/SDCard или /хранения/SDCard (примечание отсутствия завершающего ноля).
Используйте любой вкус
Environment.getExternalStorageDirectory().getAbsolutePath();
// e.g .getPath() .getName() etc.
// or
Environment.getExternalStoragePublicDirectory() ...
или использовать медиа-URI, чтобы сообщить систему расположения файла. (Удивительно, что это тоже не сработало.)
Теперь сохраните файл - вы увидите его в проводнике файлов DDMS. И вы можете получить его через ADB для проверки. Но просто попробуйте прочитать тот же самый файл - с помощью того же приложения, которое вы написали с ним в первую очередь! ENOENT - файл не найден. Hardcode путь, добавьте '/ external_sd /' к пути, который вызов os дает выше (Sumsung говорит, что это необходимо, но оно не приседает.)
Измените 'sdcard0' на 'sdcard', как некоторые предложили ... пробовал все это тоже. Пшик.
Разрешения и т. Д. Все правильно, конечно (с каких пор процесс может записать файл, но не прочитать его??).
USB кабель подключен или нет, режим отладки или нет, «реальное приложение» против приложения разработчик (ненадежное приложение) - результаты все равно: ENOENT)
Любые идеи или предложения о том, как продолжить здесь?
(с кувалдой в руке, пристально на новом ИК3 ... И, SAMSUNG, если вы читаете это: «/storage/sdcard0/external_sd/myFileFoo.txt» не работает.)
/**
*
* [Edit - added sample of failing code, as requested]
*/
public void testFile() {
ImageView image ;
String m_Path = "/SamsuxS3/" ; // more fun than a barrel of NULLs
String m_MyFile = "myFileFoo.jpg" ;
image = (ImageView) findViewById (R.id.imageView1) ;
//// Test 0:
m_Path = Environment.getExternalStorageDirectory().getAbsolutePath() ;
//// Test 1:
// String getPath = Environment.getExternalStorageDirectory().getPath(); // fails
// m_Path = getPath ;
//// Test 2:
// String getName = Environment.getExternalStorageDirectory().getName() ; //fails
// m_Path = getName ;
//// Test 3:
// String defPics = Environment.DIRECTORY_PICTURES; // fails
// m_Path = m_path + "/" + defPics + "/" ;
//// Test 4:
// m_Path = "/storage/sdcard0/" ; // fails
//// Test 5:
// m_Path = "/storage/sdcard0/external_sd/" // Samsung says so, but it fails too.
//// Test 6: now we're really hacking ...
// m_Path = "/storage/sdcard/" // Fails (although sdcard is mounted as sdcard0 - hmmm)
InputStream fIn = null;
File fileIn = new File(m_Path, m_MyFile);
try { //// This is only one way many attempts...
//// 1) just grab an image from a known resource,
//// 2) try to save it,
//// 3) then read it back into an ImageView.
//// External storage must be mounted or this fails.
InputStream is = getResources().openRawResource(R.drawable.somepicture) ; // works
OutputStream os = new FileOutputStream(fileIn); // OK
byte[] data = new byte[is.available()]; // OK
is.read(data); // OK
os.write(data); // OK - DDMS file explorer verfied
is.close();
os.close();
} catch (IOException e) {
Log.d("Error writing to " + m_Path, e.toString()); // never happened yet
}
//// now we step into the SamDung
////
InputStream fIn2 = null; //// Well, it's redundant but ...
File fileIn2 = new File(m_Path, m_MyFile);
try {
fIn2 = new FileInputStream (fileIn2) ;
//
// Here be the Dragons...
//
// Next line WORKS on every device EXCEPT a Samsung - blows up w/ ENOENT !
//
image.setImageBitmap (BitmapFactory.decodeStream(fIn2));
fIn2.close();
} catch (Exception IOError) {
Log.d("WTF? I'm not moving to Korea: ", IOError.toString()) ;
}
}
Опубликовать пример приложения, демонстрирующего вашу проблему. – CommonsWare
Думал, что это было ясно, но, как вы просили ... см. Редактирование в нижней части OP. спасибо - H –
Более того, если я собираюсь выложить $ 400 +, чтобы купить устройство, чтобы попытаться воспроизвести вашу проблему, было бы неплохо быть очень уверенным **, что я не трачу свое время и Деньги. Вот почему я попросил - и продолжаю просить - для ** пример приложения ** (т. Е. Полный проект Android).IOW, если вы хотите, чтобы другие могли воспроизвести вашу проблему, чтобы попытаться помочь вам преодолеть это, тем больше вы можете дать нам, которые будут четко воспроизводить эту проблему, тем лучше. – CommonsWare