///编辑
我尝试在主线程上运行程序,它可以读取并保存。
我认为是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();
}
}
答案 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)?