Android使用本机相机保存图像
我想启动本机android摄像头并将图像保存在指定位置。问题是在我单击照片后,预览会显示保存/放弃选项。单击“保存”后,相机将再次启动,并且我捕获的图像不会保存在指定位置。而是保存在默认位置。实际上,我需要我单击的图像的位置。这是我用来启动相机的代码Android使用本机相机保存图像,android,android-camera,Android,Android Camera,我想启动本机android摄像头并将图像保存在指定位置。问题是在我单击照片后,预览会显示保存/放弃选项。单击“保存”后,相机将再次启动,并且我捕获的图像不会保存在指定位置。而是保存在默认位置。实际上,我需要我单击的图像的位置。这是我用来启动相机的代码 MediaScannerConnection_MSC = null; String fileName = String.valueOf(System.currentTimeMillis())+".jpg"; f = new File(Environ
MediaScannerConnection_MSC = null;
String fileName = String.valueOf(System.currentTimeMillis())+".jpg";
f = new File(Environment.getExternalStorageDirectory(), fileName);
_imageUri = Uri.fromFile(f);
// create new Intent
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri);
startActivityForResult(intent, 1);
这是从摄像机返回后的代码
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
// use imageUri here to access the image
final String imagePath = f.getAbsolutePath();
_MSC = new MediaScannerConnection(this, new MediaScannerConnectionClient() {
public void onMediaScannerConnected() {
_MSC.scanFile(imagePath, null);
}
public void onScanCompleted(String path, Uri uri) {
_MSC.disconnect();
_MSC = null;
}
});
_MSC.connect();
}
}
}
我在这里犯了什么错误我想我已经得到了你的答案,我到处寻找这个答案,这有点棘手 首先,我认为在某些手机上
intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri);
被忽略:-(
因此,我最好的回答是,不要设置“EXTRA_OUTPUT”标志,而是让它正常运行并返回新的图片URI。然后,使用:
Uri u = intent.getData();
要获取新图片的信息,然后使用FileOutputStream将图像文件写入我想要的新位置。然后,最后,删除原始文件。:-)
我知道这有点胡闹,但它很有效,而且我认为它相当可靠。:-)
我希望这有帮助。:-)
-贾里德
8-28-11
@兰戈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;
}
}
我有一个非常类似的问题。有人能回答这个问题吗?好的,让我试试看,看看是怎么回事up@llangoJ,我已经修改并扩展了代码,所以你可以复制并粘贴到你的应用程序中。如果这不能为您解决问题,请告诉我。:-)@Jared这对我不起作用,首先,你试图调用
String
上不存在的add()
,还有,你正在使用的IO类是什么?@James.Elsey我刚刚修改了代码,去掉了不存在的字符串。这只是因为我必须对我的原始代码做一些重大的修改,以使你们更容易理解。说到这里,我已经包含了我正在使用的FileIO类,所以您也可以使用它。我希望这有帮助!:-)