将文件写入SD_Card

时间:2013-03-05 03:20:16

标签: android file-io bitmap android-sdcard

///编辑

我尝试在主线程上运行程序,它可以读取并保存。

我认为是asynctask的问题!!

///

首先我已经将用户权限添加到了android清单

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

我尝试从 mnt / sdcard / Bluetooth 读取原始图像数据并对其进行处理,然后写入内部SD卡,写入路径为 mnt / sdcard / Bluetooth

该程序可以在我的Android模拟器中运行并保存文件。

然而,当它运行真正的手机时,似乎手机只能读取我的文件,但不能保存文件。

    public class MainActivity extends Activity {
String filenameIn ="ardrone.raw"; 
File file = new File(Environment.getExternalStorageDirectory()+"/Bluetooth/",            filenameIn);
String filename ="convertA.jpg"; 
File outputfile = new File(Environment.getExternalStorageDirectory() +"/Bluetooth/",filename);
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myImageView = (ImageView)findViewById(R.id.imageView);
    Toast.makeText(this, "search raw file", Toast.LENGTH_LONG).show();
    new imageProcess().execute(); 
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://" + Environment.getExternalStorageDirectory())));        
     Bitmap myBitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()
             .getAbsolutePath()+"/Bluetooth/convertA.jpg");
     myImageView.setImageBitmap(myBitmap);

    if (file.exists()){
         Toast.makeText(this, "InFile:)", Toast.LENGTH_LONG).show();
    }
    else{
         Toast.makeText(this, "InFile:(((((", Toast.LENGTH_LONG).show();
    }
    if (outputfile.exists()){
         Toast.makeText(this, "outputfile:)", Toast.LENGTH_LONG).show();
    }
    else{
         Toast.makeText(this, "outputfile:(((((", Toast.LENGTH_LONG).show();
    }

}

public class imageProcess extends AsyncTask<String, Integer, Boolean>{
    Boolean check_point= false;
    @Override
    protected Boolean doInBackground(String... arg0) {

        try {
                receiveVideoRawData();

        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }

            return null;
      }  


}   




public void receiveVideoRawData() throws IOException{
    byte[] buf_rcv = new byte[153600];
    ByteArrayOutputStream ous = new ByteArrayOutputStream();
    InputStream ios = new FileInputStream(file);
    int read = 0;
     while ( (read = ios.read(buf_rcv)) != -1 ) {
               ous.write(buf_rcv, 0, read);
            }
                ous.close();
                ios.close();

        ReadRawFileImage readMyRawData=new ReadRawFileImage();      
        image = readMyRawData.readUINT_RGBImage(buf_rcv);
                    //transfer data
        OutputStream _outStream  = new FileOutputStream(outputfile);
         Bitmap pBitmap = image ;
         pBitmap.compress(Bitmap.CompressFormat.JPEG, 90, _outStream); 
          _outStream.flush();
          _outStream.close();





}
}

4 个答案:

答案 0 :(得分:1)

首先要检查你的路径是否存在;在不同的手机上,SD卡可以安装在不同的位置。在我的Linux上,

$ ~/android-sdk-linux/platform-tools/adb shell ls -l /mnt/sdcard/

第二件事是检查文件和包含目录的权限。

然后,您可能会检查日志(它们可能已包含错误消息);然后,将调试输出添加到代码中,并使用该调试输出检查日志。

答案 1 :(得分:0)

尝试使用file.writable(true)使您的新文件可写。也可能是你的新文件确实存在。

答案 2 :(得分:0)

显然,如果您没有写入权限,则只需设置外部读取权限,这可能会覆盖您的写入权限? http://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE

答案 3 :(得分:0)

首先,您应该确认真实设备具有SDCARD存储空间某些设备没有“SDCARD”存储空间)。 请参阅以下参考以获取所有存储列表
How to list additional external storage folders (mount points)?