2013-06-01 28 views
0

在我的Android项目中,我尝试将位图保存到指定位置的SD卡上。压缩位图时的Android IOException

当我运行这个,我得到一个IOException每一次,说权限被拒绝。这是创建FileOutputStream。

这使我相信我失去了权限,但我包括READ and WRITE_EXTERNAL_STORAGE。它们在我的uses-sdk块之前声明,并位于应用程序块之外。我也read/write文本到我的应用程序中的其他地方的文件,并且工作得很好。我目前的代码已被修改为与我在网上找到的几种解决方案相匹配,但我无法成功保存bitmap文件。

如果有人能指出我的错误,我会非常感激。

ImageView imageView = (ImageView) findViewById(R.id.new_pnm_pic); 
    Bitmap bm = (Bitmap)data.getExtras().get("data"); 
    imageView.setImageBitmap(bm); 
    String outPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Recruits"; 

    try { 
      File d = new File(outPath); 
      if (!d.exists()) 
      d.mkdirs(); 

      SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd-kk-mm-ss"); 
      String currentTime = sd.format(new Date()); 

      File file = new File(outPath+'/'+currentTime+".jpg");    
      FileOutputStream fOut = new FileOutputStream(file.getPath()); 

      bm.compress(Bitmap.CompressFormat.JPEG, 50, fOut); 

      fOut.flush(); 
      fOut.close(); 

     } 
    catch(IOException ioe){ 
    Toast.makeText(this, "Nice try but didn't work", Toast.LENGTH_SHORT).show(); 
     } 
+0

如果使用Environment.getExternalStorageDirectory()。toString()+“Recruits”定义outPath,它会起作用吗?我有一个getAbsolutePath()类似的问题,它解决了它。做一个日志。在logcat中查看完整路径。 – Opiatefuchs

+0

是否在模拟器上运行这个 – Sam

+0

我将outPath改为 Environment.getExternalStorageDirectory()。toString()+“/ Recruits”; 和使用日志,看看我的文件是使用以下路径 W¯¯测试// MNT/SD卡/新兵/ 2013-06-01-17-26-50.jpg(23309) 当我试图测试后我创建了日志没有显示的FileOutputStream,这意味着这是异常。我也尝试使用替代构造函数FileOutputStream(File),我仍然得到这个异常。 山姆:我在我的设备上运行这个 – user2442678

回答

2

改变这种

File file = new File(outPath+'/'+currentTime+".jpg"); 



File file = new File(d+'/'+currentTime+".jpg"); 

并添加权限到manifest文件: -

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

编辑
我们开始保存图像到SD卡之前,我们需要检查是否sd card is mounted or not

+0

我尝试了File的替代构造函数,它没有改变任何东西。我的权限也很好,他们已经被检查过,并且在我的应用程序的其他部分读写外部存储没有错误。 – user2442678

+0

你在模拟器上运行过吗? – Sam

+0

没有这是在我的设备上运行 – user2442678