user2580401
user2580401

Reputation: 1889

android save images to internal storage

I'm having problems implementing this code Saving and Reading Bitmaps/Images from Internal memory in Android

to save and retrieve the image that I want, here is my code:

ContextWrapper cw = new ContextWrapper(getApplicationContext());
             // path to /data/data/yourapp/app_data/imageDir
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            // Create imageDir
            File mypath=new File(directory, + name + "profile.jpg");

            FileOutputStream fos = null;
            try {           

                fos = new FileOutputStream(mypath);

           // Use the compress method on the BitMap object to write image to the OutputStream
                myBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

and to retrieve(I don't know if I'm doing wrong)

 @Override
   protected void onResume()
   {
      super.onResume();

      try {
          File f  = new File("imageDir/" + rowID, "profile.jpg");
        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
        image = (ImageView) findViewById(R.id.imageView2);
        image.setImageBitmap(b);

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

and nothing happens so what should I change??

Upvotes: 5

Views: 33921

Answers (4)

Shravan DG
Shravan DG

Reputation: 537

I got it working!

First make sure that your app has the storage permission enabled:

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

Permissions in manifest:

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

So, if you want to create your own directory in your File Storage you can use somethibng like:

FileOutputStream outStream = null;
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();
refreshGallery(outFile);

Else, if you want to create a sub directory in your default device DCIM folder and then want to view your image in a separate folder in gallery:

FileOutputStream fos= null;
    File file = getDisc();
    if(!file.exists() && !file.mkdirs()) {
        //Toast.makeText(this, "Can't create directory to store image", Toast.LENGTH_LONG).show();
        //return;
        print("file not created");
        return;
    }
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyymmsshhmmss");
    String date = simpleDateFormat.format(new Date());
    String name = "FileName"+date+".jpg";
    String file_name = file.getAbsolutePath()+"/"+name;
    File new_file = new File(file_name);
    print("new_file created");
    try {
        fos= new FileOutputStream(new_file);
        Bitmap bitmap = viewToBitmap(iv, iv.getWidth(), iv.getHeight() );
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        Toast.makeText(this, "Save success", Toast.LENGTH_LONG).show();
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        print("FNF");
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    refreshGallery(new_file);

Helper functions:

public void refreshGallery(File file){
    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    intent.setData(Uri.fromFile(file));
    sendBroadcast(intent);
}

private File getDisc(){
    String t= getCurrentDateAndTime();
    File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    return new File(file, "ImageDemo");
}

private String getCurrentDateAndTime() {
    Calendar c = Calendar.getInstance();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
    String formattedDate = df.format(c.getTime());
    return formattedDate;

public static Bitmap viewToBitmap(View view, int width, int height) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

Hope this helps!

Upvotes: 0

Brandon
Brandon

Reputation: 411

I think Faibo's answer should be accepted, as the code example is correct, well written and should solve your specific problem, without a hitch.

In case his solution doesn't meet your needs, I want to suggest an alternative approach.

It's very simple to store image data as a blob in a SQLite DB and retrieve as a byte array. Encoding and decoding takes just a few lines of code (for each), works like a charm and is surprisingly efficient.

I'll provide a code example upon request.

Good luck!

Upvotes: 2

August Falbo
August Falbo

Reputation: 161

To Save your bitmap in sdcard use the following code

Store Image

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    } 
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }  
}

To Get the Path for Image Storage

/** Create a File for saving an image or video */
private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this. 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files"); 

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    } 
    // Create a media file name
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
        String mImageName="MI_"+ timeStamp +".jpg";
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);  
    return mediaFile;
} 

Upvotes: 14

Jans
Jans

Reputation: 11250

Note that you are saving the pick as name + profile.jpg under imageDir directory and you're trying to retrieve as profile.jpg under imageDir/[rowID] directory check that.

Upvotes: 1

Related Questions