2013-05-09 3 views
0

В течение нескольких недель мы сталкиваемся с проблемой, которая обсуждалась ранее в 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()) ; 
     } 
    }  
+0

Опубликовать пример приложения, демонстрирующего вашу проблему. – CommonsWare

+0

Думал, что это было ясно, но, как вы просили ... см. Редактирование в нижней части OP. спасибо - H –

+0

Более того, если я собираюсь выложить $ 400 +, чтобы купить устройство, чтобы попытаться воспроизвести вашу проблему, было бы неплохо быть очень уверенным **, что я не трачу свое время и Деньги. Вот почему я попросил - и продолжаю просить - для ** пример приложения ** (т. Е. Полный проект Android).IOW, если вы хотите, чтобы другие могли воспроизвести вашу проблему, чтобы попытаться помочь вам преодолеть это, тем больше вы можете дать нам, которые будут четко воспроизводить эту проблему, тем лучше. – CommonsWare

ответ

3

proper way to write a file on Android для Android 3.0+, где вы собираетесь использовать файл снова быстро, это:

os.flush(); 
    os.getFD().sync(); 
    os.close(); 

для FileOutputStream имени os.

Используя это изменение, ваш пример кода работает с Environment.getExternalStorageDirectory(), на Samsung Galaxy S3, работающем под управлением Android 4.1.2.

+0

Спасибо за ответ, но быстро прочитать файл не было проблемой ... он заставлял его читать в _at all_ с помощью «известного» пути и имени файла. Samsung ошибочно обнародовал, что нам нужно добавить «external_sd /» к возвращенному пути - независимо от того, является ли этот путь через String ~ .getAbosultePath() или File ~ .getExternalStorageDirectory(); Даже их собственный образец кода не работает на 4.1.1 ... еще не пробовал 4.2.2. –

+0

@HowardPautz: Попробуйте рецепт в любом случае. Я смог воспроизвести вашу проблему, и этот рецепт исправил ее. – CommonsWare

+0

Спасибо, как я сказал в OP, я пробовал много вещей, в том числе то же, что и ваш рецепт. Из соображений ваших усилий от моего имени, которые я действительно ценю, я попробовал свой рецепт («снова»), прежде чем отвечать раньше, конечно. Это все еще не работает. ... Сильные ветры дуют, что Samsung хочет выйти из Google Google, сбросив Android в пользу Tizen ... наша боль только началась ... попробуйте использовать их «webkit», если вы не верите слухам. –

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