Saving an image from ImageView into internal storage

别等时光非礼了梦想. 提交于 2020-01-01 19:56:46

问题


I have created an ImageView and I can see the preview of the Camera and load the captured image into the ImageView and I wanted to store the image into a directory in my internal memory. I have referred many posts and tried but I couldn't find my image in my internal memory. This is the code I have used:

 package com.example.shravan.camera;

 import android.content.Context;
 import android.content.ContextWrapper;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.support.v7.app.AppCompatActivity;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
 import android.widget.ImageView;

 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;


 public class MainActivity extends AppCompatActivity {
  private final String TAG = "abc";


static final int REQUEST_IMAGE_CAPTURE =1 ;
ImageView iv;
Uri imageUri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btn = (Button)findViewById(R.id.myB);
    iv = (ImageView) findViewById(R.id.myIV);
    //disable the button if the user has no camera
    if(!hasCamera())
    {
        btn.setEnabled(false);
    }
}


public boolean hasCamera()
{

    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}

//on click event handler that launches the camera
public void launchCamera(View v)
{
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(i, REQUEST_IMAGE_CAPTURE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK)
    {
        imageUri=data.getData();
        iv.setImageURI(imageUri);;
    }
}

public void SaveFile(View v){
    BitmapDrawable drawable = (BitmapDrawable) iv.getDrawable();
    Bitmap bitmap = drawable.getBitmap();

    print("Creating cw");
    ContextWrapper cw = new ContextWrapper(this.getApplicationContext());
    print("Creating dir");
    File directory = cw.getDir("ImagesDir", Context.MODE_PRIVATE);
    print("Created dir" + directory);
    File mypath=new File(directory,"myImagesDGS.jpg");
    print("path is"+mypath);

    FileOutputStream fos = null;
    try {
        print("creating fos");
        fos = new FileOutputStream(mypath);
        print("Compressing bitmap");
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            fos.close();
            print("fos closed");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void print(String str){
    Log.d(TAG, str);
}

}

I have made many log messages to debug and I got one path which I couldn't find in my phone. This is the logcat:

08-07 21:47:37.089 11030-11030/com.example.shravan.camera D/abc: Creating cw 08-07

21:47:37.089 11030-11030/com.example.shravan.camera D/abc: Creating dir 08-07

21:47:37.099 11030-11030/com.example.shravan.camera D/abc: Created dir/data/user/0/com.example.shravan.camera/app_ImagesDir 08-07

21:47:37.099 11030-11030/com.example.shravan.camera D/abc: path is/data/user/0/com.example.shravan.camera/app_ImagesDir/myImagesDGS.jpg

08-07 21:47:37.099 11030-11030/com.example.shravan.camera D/abc: creating fos

08-07 21:47:37.099 11030-11030/com.example.shravan.camera D/abc: Compressing bitmap

08-07 21:47:42.589 11030-11030/com.example.shravan.camera D/abc: fos closed

Is there anything I need to check and I should change? Please help!


回答1:


Got it working!

I used this code to create a directory in my file storage and then store the image:

FileOutputStream outStream = null;

    // Write to SD Card
    try {
        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File(sdCard.getAbsolutePath() + "/camtest");
        dir.mkdirs();

        String fileName = String.format("%d.jpg", System.currentTimeMillis());
        File outFile = new File(dir, fileName);

        outStream = new FileOutputStream(outFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
        outStream.flush();
        outStream.close();

        Log.d(TAG, "onPictureTaken - wrote to " + outFile.getAbsolutePath());

        refreshGallery(outFile);
    } catch (FileNotFoundException e) {
        print("FNF");
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }

My permissions:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Finally, the most important thing:

Go to Device Settings>Device>Applications>Application Manager>"your app">Permissions>Enable Storage permission!




回答2:


try this. I modified my code to fit the code your provide. I did not test it. I temporary store the photo taken into a file with time stamp, then use the filename to retrieve the file. Hope it helps

private Uri mImageCaptureUri;
public void launchCamera(View v)
{
    //Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    //startActivityForResult(i, REQUEST_IMAGE_CAPTURE);

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
                            "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));

                    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (mImageCaptureUri!=null){
//Do whatever you want with the uri
}

}
}



回答3:


Your image is saving from this path /data/user/0/com.example.shravan.camera/app_ImagesDir/myImagesDGS.jpg but your are not access.try this code for iamge reading.Call this method into onCreate this method is return you bitmap.

 Bitmap mBitmap= getImageBitmap(this,"myImagesDGS","jpg");

   if(mBitmap !=null){

yourImageView.setBitmap(mBitmap);

}else{

Log.d("MainActivity","Image is not found");
}

It is sepread method

     public Bitmap getImageBitmap(Context context,String name,String extension){
        name=name+"."+extension;  
        try{ 
            FileInputStream fis = context.openFileInput(name);
                Bitmap b = BitmapFactory.decodeStream(fis);
                fis.close();
                return b;
            } 
            catch(Exception e){
            } 
            return null; 
        }



回答4:


The location your current images are saving, cannot be accessed by an other application.It's better to save them in a accessible location.try like this..

BitmapDrawable drawable = (BitmapDrawable) iv.getDrawable();
Bitmap bitmap = drawable.getBitmap();
 try {
           String root = Environment.getExternalStorageDirectory().toString();
           File file = new File(root + "/YourDirectory/myImagesDGS.jpg");
           FileOutputStream out = new FileOutputStream(file);
           bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
           out.flush();
           out.close();

                                } catch (Exception ex) {
                                    ex.printStackTrace();
                                }

then you can retrieve your saved images like this..

String root = Environment.getExternalStorageDirectory().toString();
  File file = new File(root + "/YourDirectory/myImagesDGS.jpg");    
Bitmap bmap=BitmapFactory.decodeFile(file.getAbsolutePath());



回答5:


With that code, you will be ended to store your file to your private application data. You can't access that data with other applications except your application itself without root access. You can get the public image directory by using this code instead when declaring the file path if you want your image file can be accessed by other applications.

File albumF;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    albumF = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
} else {
    albumF = context.getFilesDir();
}

If you need to make your sub directory inside public gallery directory, you can change the code above like this:

File albumF;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    albumF = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DCIM), YOUR_SUB_DIRECTORY_STRING);
} else {
    albumF = new File(context.getFilesDir(), YOUR_SUB_DIRECTORY_STRING);
}

You might be need to add this code to create that album directory

if (!albumF.exists()) {
    albumF.mkdirs();
}



回答6:


Try using ImageSaver. It's a synchronous way to save and load images from internal and external storage.

Usage

  • To save:

    new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            setExternal(true).
            save(bitmap);
    
  • To load:

    Bitmap bitmap = new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            setExternal(true).
            load();
    


来源:https://stackoverflow.com/questions/38820673/saving-an-image-from-imageview-into-internal-storage

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!