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)