我想我有你的答案,我已经为这个问题搜索了高低,这有点棘手。
首先,我认为在某些手机上,
intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri);
被忽略:-(
所以我对你的最佳答案是,不要设置“EXTRA_OUTPUT”标志,而是让它正常运行并返回你的新图片 URI。然后,从那里,使用:
Uri u = intent.getData();
要获取新图片的信息,然后从那里,我使用 FileOutputStream 将图像文件写入我想要的新位置。然后,最后,我删除了原始文件。:-)
我知道这有点做作,但它确实有效,而且我认为它非常可靠。:-)
我希望这会有所帮助。:-)
-贾里德
8-28-11
@llango J
好的,这是整个代码,欢迎您复制并粘贴它,看看您是否可以让它工作:-)
对于初学者,您需要像这样调用相机:
startActivityForResult(CameraIntent, TAKE_PICTURE);
然后,对于结果,您将需要:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case TAKE_PICTURE:
Uri u = intent.getData();
//Toast.makeText(getApplicationContext(), u.getPath(), Toast.LENGTH_SHORT).show();
WriteFiles(u);
break;
}
}
}
然后主要的魔法发生在这个函数中:
private void WriteFiles(Uri myNewPic) {
String TempFilePath;
String TempPath;
File directory = new File("/sdcard/" + getString(R.string.app_name));
if (!directory.exists()) {
directory.mkdirs();
}
String TempPictureFile;
try {
TempPictureFile = myNewPic.getLastPathSegment() + ".jpg";
TempFilePath = directory.getPath() + "/" + TempPictureFile;
FileOutputStream myOutStream = new FileOutputStream(TempFilePath);
InputStream myInStream = getContentResolver().openInputStream(myNewPic);
FileIO myFileIO = new FileIO();
myFileIO.copy(myInStream, myOutStream);
//now delete the file after copying
getContentResolver().delete(myNewPic, null, null);
TempFilePaths.add(TempFilePath);
} catch (Exception e) {
Toast.makeText(getApplicationContext(), getString(R.string.ErrorOpeningFileOutput), Toast.LENGTH_SHORT).show();
}
}
我认为这是您使用本机相机应用程序保存所需的所有部分。但是,我必须提醒你,我最终放弃了这段代码,因为我需要比它提供的更多的灵活性和可靠性(我在想如果你在大量不同的手机上使用这个应用程序,我可能会看到它有问题是有原因的或其他。例如,由于三星自定义用户界面,我遇到了很多问题,因此除了三星手机之外,所有手机都运行良好。:-P)。所以我最后只是创建了一个我自己的相机应用程序,但我相信根据你的应用程序,这可能对你有用。不管怎样……祝你好运!:-)
好的,这是我使用的 FileIO 类,抱歉,我最初没有包含它:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.util.Log;
public class FileIO {
private static final int BUFFER_SIZE = 1024 * 2;
public FileIO() {
// Utility class.
}
public int copy(InputStream input, OutputStream output) throws Exception, IOException {
byte[] buffer = new byte[BUFFER_SIZE];
BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE);
BufferedOutputStream out = new BufferedOutputStream(output, BUFFER_SIZE);
int count = 0, n = 0;
try {
while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
out.write(buffer, 0, n);
count += n;
}
out.flush();
} finally {
try {
out.close();
} catch (IOException e) {
Log.e(e.getMessage(), null);
}
try {
in.close();
} catch (IOException e) {
Log.e(e.getMessage(), null);
}
}
return count;
}
}