2012-04-29 102 views
0

我的代码,但现在我甚至不能让一个目录。 (请注意,“1”不会打印到logcat上。)我不知道我打破了什么。我想保存的图像创建的文件夹中,这里是我的代码:无法在SD卡上创建文件夹,用来上班的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) 

我应该对SD卡的安装状况如何呢?

在这段代码的结果是“不好”的声明。我该如何改变这种情况?

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" /> 

。查看计算器例如“/ SD卡”常量字符串等问题Permission to write to the SD card

+0

我已经写好了。就像我说的这个代码昨天工作。我不知道发生了什么,但今天没有工作。 – Merve

1
  • 而不是使用的,使用Environment.getExternalStorageDirectory().getAbsolutePath()

这会给你的SD卡根路径(这可能不只是“/ SD卡”在一些设备中

  • 它通常“到/ mnt/SD卡”,而不是“/ SD卡”。如果你想要的东西做实验,做的第一件事就是得到一些澄清事实。

  • 你初始化的“分隔符”不变,但你继续使用“/”来创建你的路。这是从你与你的问题粘贴代码引用:

    文件storefile =新的文件(storedir + “/” + mDateTime + “/” +分离器 + last_fileName);

你能看出它有什么问题吗?

+0

感谢您的回复,我用“Environment.getExternalStorageDirectory()。getAbsolutePath()”更改了“storedir”。我从错误的行删除分隔符。但它并没有工作。我添加了几乎所有的代码,但是我的问题在第五行。 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

谢谢,我试过这段代码,它并没有解决异常。同时,我找到了一个代码示例(我将其编辑为我的问题)。结果是“不好”声明。我应该为SD卡的安装情况做些什么? – Merve

+0

如果SD卡未挂载('if(!checkExternalMedia())'),则不能执行任何操作。在这种情况下,你只能显示一个错误对话框或类似的东西。如果您的设备通过USB连接到PC,并且共享SD卡,则取消共享,以便Android可以再次使用该SD卡。 – zapl

+0

“如果您的设备通过USB连接到PC,并且共享SD卡,则取消共享,这样sdcard就可以再次被Android使用。”你能否详细说明如何做到这一点? – RenniePet

相关问题