Java Android摄像头应用程序:保存和显示位图
我正在开发这个摄像头应用程序,但显示用户拍摄的图像时遇到问题。“摄影机”、“预览”和“捕获”按钮在主要活动中可以完美地工作。现在,应用程序将照片保存到Java Android摄像头应用程序:保存和显示位图,java,android,android-activity,camera,internal,Java,Android,Android Activity,Camera,Internal,我正在开发这个摄像头应用程序,但显示用户拍摄的图像时遇到问题。“摄影机”、“预览”和“捕获”按钮在主要活动中可以完美地工作。现在,应用程序将照片保存到Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES),“MyCameraApp”,但我不想将图像保存在那里。我只想将该图像传递到下一个活动(而不是将其保存到公共目录)。有办法做到这一点吗?我看过教程,但不知道如何实现MODE.PRIVATE 这
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES),“MyCameraApp”
,但我不想将图像保存在那里。我只想将该图像传递到下一个活动(而不是将其保存到公共目录)。有办法做到这一点吗?我看过教程,但不知道如何实现MODE.PRIVATE
这就是它的名称:
@Override
public void onPictureTaken(final byte[] data, Camera camera) {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log.d(TAG, "Error creating media file, check storage permissions: ");
return null;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
return pictureFile.getPath();
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
return null;
} catch (IOException e) {
Log.d(TAG, "Error accessing file: " + e.getMessage());
return null;
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if(result != null){
Intent intent = new Intent(mContext, ImageDisplayActivity.class);
intent.putExtra(ImageDisplayActivity.KEY_PATH, result);
startActivity(intent);
}
}
}.execute();
}
试试这个
ActivityOne.Java
try {
//Write file
String filename = "photo.png";
FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
bmp.compress(Bitmap.CompressFormat.PNG, 200, stream);
//Cleanup
stream.close();
//Pop intent
Intent mIntent= new Intent(this, ActivityTwo.class);
in1.putExtra("bitmap", filename);
startActivity(mIntent);
} catch (Exception e) {
e.printStackTrace();
}
ActivityTwo.Java
Bitmap bmp = null;
String filename = getIntent().getStringExtra("bitmap");
try {
FileInputStream is = this.openFileInput(filename);
bmp = BitmapFactory.decodeStream(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
并用位图设置Imageview,您可以获得从相机捕获的位图
看看这个例子:
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
所以基本上,你只需要有一个文件名就可以在私有模式下创建一个文件。
只需保留方法getOutputMediaFile(int类型)的最后一部分,它应该是这样的:
private static File getOutputMediaFile(int type){
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
Locale.getDefault()).format(new Date());
if (type == MEDIA_TYPE_IMAGE) {
mediaFile = "IMG_"+ timeStamp + ".jpg";
} else {
return null;
}
return mediaFile;
}
然后只需更改doInBackground函数的这一尝试:
try {
FileOutputStream fos = openFileOutput(pictureFile, Context.MODE_PRIVATE);
fos.write(data);
fos.close();
return pictureFile;
}
只需给出其他活动的路径并创建bmp
String filepath = intent.getStringExtra("EXTRA_FILE");
java.io.FileInputStream in = openFileInput(filepath);
Bitmap bmp = BitmapFactory.decodeStream(in)
接下来,您不能故意传递大图像,所以最好的方法是将图像存储在临时文件中,并在第二个活动中获取它。但是openFileOutput方法去哪里了?尽管mediaStorageDir未初始化。我不知道该创建哪个目录……哎呀,我会编辑代码,但是,您不必设置mediaStorageDir,它将存储在您的私有目录中(类似于mycameraapp.myapplication),您只需提供文件名即可
String filepath = intent.getStringExtra("EXTRA_FILE");
java.io.FileInputStream in = openFileInput(filepath);
Bitmap bmp = BitmapFactory.decodeStream(in)