【问题标题】:Android: Saving Picture to a File and Retrieving itAndroid:将图片保存到文件并检索它
【发布时间】:2011-10-15 06:21:30
【问题描述】:

用我的相机拍照后,我想把它保存在那个布局中。我还想将其保存到文件中,并能够在创建活动时加载该图片(因此,如果我切换到不同的活动并返回到该活动)。目前我可以拍照并显示,但是如果我多次切换活动,图片就会丢失。我有以下相关代码:

我使用 setImage() 加载我的图片 OnCreate:

private void setImage(){
    if (loadPicture("hello", bitmap) != null) {
        Toast.makeText(this, "not null", Toast.LENGTH_SHORT).show();
        imageView.setImageBitmap(loadPicture("hello", bitmap));
    }
}

private void takePicture(){
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    File photo =
            new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
    imageUri = Uri.fromFile(photo);
    startActivityForResult(intent, 0);

}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
        Uri selectedImage = imageUri;
            getContentResolver().notifyChange(selectedImage, null);

            ContentResolver cr = getContentResolver();

            try {
                bitmap = android.provider.MediaStore.Images.Media
                        .getBitmap(cr, selectedImage);

                imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, bitmap.getHeight()/2, bitmap.getWidth()/2, false));
                //**Where I save the picture**
                savePicture("hello", bitmap, getApplicationContext());


     }

private void savePicture(String filename, Bitmap b, Context ctx){
    try {
        ObjectOutputStream oos;
        FileOutputStream out;// = new FileOutputStream(filename);
        out = ctx.openFileOutput(filename, Context.MODE_PRIVATE);
        oos = new ObjectOutputStream(out);
        b.compress(Bitmap.CompressFormat.PNG, 100, oos);

        oos.close();
        oos.notifyAll();
        out.notifyAll();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private Bitmap loadPicture(String filename, Bitmap b){
    // Drawable myImage = null;
    try {
        FileInputStream fis = openFileInput(filename);
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(fis);
        } catch (StreamCorruptedException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        // myImage = Drawable.createFromStream(ois, filename);
        b = BitmapFactory.decodeStream(ois);
        try {
            ois.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    // return myImage;
    return b;

}

【问题讨论】:

    标签: java android android-layout image


    【解决方案1】:
    out = ctx.openFileOutput(filename, Context.MODE_PRIVATE);
    

    尝试切换到:

    out = ctx.openFileOutput(filename, Context.MODE_WORLD_READABLE);
    

    【讨论】:

    • 不幸的是,这似乎并没有改变任何东西。还是谢谢你。
    【解决方案2】:

    听起来您的代码有效,但是当活动返回时您正在丢失图像。加载您的图片 onPostResume() 而不是 onCreate() 可能是您需要的。感觉活动生命周期是解决问题的关键。我有几个问题要向 cmets 提出。

    【讨论】:

    • 您的问题在可能说明的细节上有点不清楚:当您说切换活动时,您是指改变照片的活动吗?您拥有的代码有一个文件是照片所在的位置,因此如果您不希望有时调用 savePicture(),我可以看到它会被破坏。当您说图片丢失时,您的意思是它不显示;它不在文件系统中;还是两者兼而有之?
    • 单击列表上的项目后,此活动显示,并且我有一个拍照按钮。然后显示。如果我返回列表,然后单击该项目,然后再次重复相同的操作,它就不再显示相同的图片了。
    • 到目前为止,我没有检索文件photo。它保存在这一行:File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");我应该使用它还是像现在一样好?
    • “不再显示相同的图片”是什么意思。如果您不介意给我们一个更详细的逐步复制,我可能会更好地理解。我听起来像 ActivityA(列表)> ActivityB(还没有照片的细节)> ActivityC(拍照)> ActivityB(现在有照片)> ActivityA(点击项目)> ActivityB(照片还在那儿)> ActivityA(点击项目)>活动B(不同的照片)
    • 是的,没错。最后一步,ActivityB(不同的照片),不同的照片只是图标,就像在默认的 imageView 中一样。顺便说一句,当我在拍照后从 B(detail) 切换回 A(list) 时(我这样做了两次,正如你所注意到的),我使用手机上的后退按钮进行操作。由于我没有适当的意图这样做,这可能是一个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多