2012-04-29 2 views
0

Мой код работал, но теперь я даже не могу создать каталог. (Обратите внимание, что «1» не печатается на логарифме.) Я понятия не имею, что я сломал. Я пытаюсь сохранить изображение в папке, которую я создаю, вот мой код:Невозможно создать папку в SdCard, Android

String storedir = "/sdcard"; 
    String separator = "/"; 
    String mDateTime = formatter.format(cal.getTime()); 
    File newdir1 = new File(storedir + "/" + mDateTime); 
      if (newdir1.mkdir()) 
       System.out.println("1"); 

    File newdir2 = new File(storedir + "/" + mDateTime + "/"); 
      if (newdir2.mkdir()) 
       System.out.println("2"); 

    // Fall into the catch because of ; 
       if (fileNameLower.indexOf(".jpeg") > 0) 
      fileExt = ".jpeg"; 
       String rand_fileName = Long.toString(System.currentTimeMillis());// +fileExt; 
     String last_fileName = rand_fileName + fileExt; 
      File storefile = new File(storedir + "/" + mDateTime + "/" + separator 
       + last_fileName); 
     String picAddress = storedir + "/" + mDateTime + "/" + separator 
       + rand_fileName + ".png"; 
     System.out.println("135 : [" + storefile.toString() + "]/n"); 

     BufferedOutputStream bos = null; 
     BufferedInputStream bis = null; 
     try { 
      Log.w("Process : " , "Starting to download process."); 
      bos = new BufferedOutputStream(new FileOutputStream(storefile)); 
      bis = new BufferedInputStream(in); 
      int c; 
      while ((c = bis.read()) != -1) { 
       bos.write(c); 
       bos.flush(); 
      } 
      Log.w("Process : " , "The image is downloaded."); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
      throw new Exception("151 : !"); 
     } finally 
     { 
      bos.close(); 
      bis.close(); 
     } 



04-29 21:29:20.648: W/The image's type(5733): .jpeg 
04-29 21:29:20.648: I/System.out(5733): log : [.jpeg]/n 
04-29 21:29:20.652: I/System.out(5733): log : [/sdcard/2012-04-29/1335734960650.jpeg]/n 
04-29 21:29:20.652: W/Process :(5733): Starting to download process. 
04-29 21:29:20.652: W/System.err(5733): java.io.FileNotFoundException: /sdcard/2012-04-29/1335734960650.jpeg (Permission denied) 
04-29 21:29:20.672: W/System.err(5733):  at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 
04-29 21:29:20.672: W/System.err(5733):  at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232) 
04-29 21:29:20.682: W/System.err(5733):  at java.io.FileOutputStream.<init>(FileOutputStream.java:94) 
04-29 21:29:20.682: W/System.err(5733):  at java.io.FileOutputStream.<init>(FileOutputStream.java:66) 
04-29 21:29:20.682: W/System.err(5733):  at com.mobil.eposta.Baglanti.saveFile(Baglanti.java:345) 
04-29 21:29:20.692: W/System.err(5733):  at com.mobil.eposta.Baglanti.saveAttachMent(Baglanti.java:255) 
04-29 21:29:20.692: W/System.err(5733):  at com.mobil.eposta.Baglanti.EkiKaydet(Baglanti.java:235) 
04-29 21:29:20.692: W/System.err(5733):  at com.mobil.eposta.Baglanti.Position(Baglanti.java:224) 
04-29 21:29:20.692: W/System.err(5733):  at com.mobil.eposta.GoruntuleActivity$1.onClick(GoruntuleActivity.java:75) 
04-29 21:29:20.707: W/System.err(5733):  at android.view.View.performClick(View.java:2485) 
04-29 21:29:20.707: W/System.err(5733):  at android.view.View$PerformClick.run(View.java:9080) 
04-29 21:29:20.712: W/System.err(5733):  at android.os.Handler.handleCallback(Handler.java:587) 
04-29 21:29:20.712: W/System.err(5733):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-29 21:29:20.712: W/System.err(5733):  at android.os.Looper.loop(Looper.java:123) 
04-29 21:29:20.712: W/System.err(5733):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-29 21:29:20.712: W/System.err(5733):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-29 21:29:20.712: W/System.err(5733):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-29 21:29:20.722: W/System.err(5733):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-29 21:29:20.732: W/System.err(5733):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-29 21:29:20.732: W/System.err(5733):  at dalvik.system.NativeStart.main(Native Method) 

Что я должен сделать для смонтированной ситуации SDCard в?

В этом коде результат «НЕ ХОРОШО». Как я могу изменить эту ситуацию?

private static boolean checkExternalMedia() 
{ 
    boolean mExternalStorageAvailable = false; 
    boolean mExternalStorageWriteable = false; 
    String state = Environment.getExternalStorageState(); 

    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     // We can read and write the media 
     mExternalStorageAvailable = mExternalStorageWriteable = true; 
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
     // We can only read the media 
     mExternalStorageAvailable = true; 
     mExternalStorageWriteable = false; 
    } else { 
     // Something else is wrong. It may be one of many other states, 
     // to know is we can neither read nor write 
     Log.i("TAG","State="+state+" Not good"); 
     mExternalStorageAvailable = mExternalStorageWriteable = false; 
    } 

    Log.i("TAG","Available="+mExternalStorageAvailable+"Writeable="+mExternalStorageWriteable+" State"+state); 
    return (mExternalStorageAvailable && mExternalStorageWriteable); 
} 
+0

Благодарим Вас за включая ваш LogCat, но это немного мала. В следующий раз, пожалуйста, используйте значок диска (помеченный как «Экспортировать выбранные элементы ...») в правом верхнем углу окна logcat, чтобы отправить копию _text_. – Sam

+0

Спасибо за предложение – Merve

ответ

1

Вам нужно

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

в вашем файле манифеста. Другие вопросы по StackOverflow, например Permission to write to the SD card

+0

Я пишу это уже. Как я уже сказал, этот код работал вчера. Я не знаю, что произошло, но сегодня не работает. – Merve

1
  • Вместо того, чтобы использовать «/ SDCARD» постоянную строку, используйте Environment.getExternalStorageDirectory().getAbsolutePath()

Это даст вам SDCard корневой путь (который не может быть просто «/ SDCard» в некоторых устройствах

  • это нормально «/ шоссе/SDCard», а не «/ SDCard». Если вы хотите поэкспериментировать с вещами, то первое, что нужно сделать, это получить некоторые факты прямо.

  • Вы инициализировали константу «разделитель», но продолжаете использовать «/» для создания своих путей. Это цитата из кода, который вы вставили с вашим вопросом:

    File storefile = new Файл (storedir + "/" + mDateTime + "/" + separator + last_fileName);

Вы видите что-то в этом плохой ситуации?

+0

Спасибо за ваш ответ. Меняю «storedir» на «Environment.getExternalStorageDirectory(). GetAbsolutePath()». И я удаляю разделитель из строк, которые являются неправильными. Но он все еще не работает. Я добавляю почти весь свой код, но моя проблема в пятой строке. newdir1.mkdir() исключение происходит из-за этого. Он не создает – Merve

+0

Я вижу часть ошибки «Разрешения на отказ» в ваших журналах, как раз по пути FileNotFoundException. Вы действительно уверены, что у вас есть разрешение в вашем манифесте? – josephus

+0

Да, я абсолютно не уверен в этом. Я знаю, я добавил это. Но для вашего ответа я проверил его, и разрешение открыто. – Merve

0

Гораздо безопаснее и проще использовать класс File для создания ваших путей.

Попробуйте это таким образом:

if (!checkExternalMedia()) { 
    // show error dialog here. 
    return; 
} 

File storedir = Environment.getExternalStorageDirectory(); 

String mDateTime = formatter.format(cal.getTime()); 
File savedir = new File (storedir, mDateTime); 

if (fileNameLower.indexOf(".jpeg") > 0) { 
    fileExt = ".jpeg"; 
} 
String rand_fileName = Long.toString(System.currentTimeMillis());// +fileExt; 
String last_fileName = rand_fileName + fileExt; 

File storefile = new File(storedir, last_fileName); 

// create all directories required for that file 
if (!storefile.mkdirs()) { 
    Log.e("Process", "can't create directories:" + storefile.getParent()); 
    // return here too 
} 

// here be streams 
+0

Спасибо, я пробовал этот код и не решает исключения. Между тем, я нашел образец кода (я редактирую его на свой вопрос). И результат - «Неплохо». Что я должен сделать для установленной ситуации sdcard? – Merve

+0

Вы не можете ничего сделать, если SD-карта не смонтирована ('if (! CheckExternalMedia())). В этом случае вы можете показывать только диалоговое окно с ошибкой или что-то в этом роде. Если у вас есть ваши устройства, подключенные через USB к компьютеру, и SD-карта является общей, а затем отключите ее, чтобы SD-карта снова могла использоваться Android. – zapl

+0

«Если у вас есть ваши устройства, подключенные через USB к вашему компьютеру, и SD-карта является общей, а затем отключите ее, чтобы SD-карта могла использоваться Android снова». Не могли бы вы рассказать о том, как это можно сделать? – RenniePet

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