I'm making a gallery in which I load (on run time) images from asset folder. Now I want to save image to SD card on the click event.
For example: When the app starts, the user see images, they can scroll through images and view them (this part is done). The problem is pictures are loading dynamically in my own gallery view. I have not hard coded them.
I want to save it to the SD card. But I don't have the hard coded path of images. There can be any number of images.
private void CopyAssets() {
AssetManager assetManager = getAssets();
InputStream in=null;
String[] files = null;
try {
files = assetManager.list("image");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for(String filename : files) {
try {
in = assetManager.open(filename);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
String dirName = Environment.getExternalStorageDirectory().toString();
File newFile = new File(dirName);
newFile.mkdirs();
OutputStream out = new FileOutputStream(newFile);
System.out.println("in tryyyy");
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(Exception e) {
Log.e("tag", e.getMessage());
}
I tried above method, I don't want to copy all the image to the SD card. But only that one which the user chooses from the gallery that too dynamically. As there will be a number of images. Hard coding each image path will be tough.
Is there any way in Android, by which I can get the current image path or URI in a string? What is View v = this.getCurrentFocus();? What does it return?
a Gallery extends from AdapterView , and just like on adapterView , you can add a listener for when an item is being selected.
one you know which item was selected , use it in order to copy the image you want to the sd-card.
for better understanding of how to implement the adapter for the adapterView , watch "the world of listView" video . you might want to put the path into the viewHolder (depending on your code and design) .
Here's a method I created that will allow you to save an image (Bitmap) to the memory. The parameters requiere a bitmap object and the filename of that object.
public void writeBitmapToMemory(String filename, Bitmap bitmap) {
FileOutputStream fos;
// Use the compress method on the Bitmap object to write image to the OutputStream
try {
fos = this.openFileOutput(filename, Context.MODE_PRIVATE);
// Writing the bitmap to the output stream
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
I hope this helps.
Related
I'm trying to save bitmap to gallery to open it again from ImagePicker intent.
The problem is - if I'm saving it on external storage, it will not work on devices without it, and when I'm writing it on internal storage - it won't shown in gallery, so i can not pick that image.
Tried so many ways of resolving it, but no success this far.
I mean, is it possible to save bitmap in internal storage and open it from activity, which called to choose image from gallery?
edit: added code
private String saveToInternalStorage(Bitmap bitmapImage, String filename){
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,filename + ".jpg");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(mypath);
// Use the compress method on the BitMap object to write image to the OutputStream
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return directory.getAbsolutePath();
}
With that procedure it's seems like saving bitmap is ok, but i can't find that file in gallery.
Im trying to save a profile photo, but when I use the save image code I got (i got almost the same example everywhere on the internet), I don't really know where the image is getting stored.
public void saveImage(Bitmap image) {
FileOutputStream out = null;
try {
out = new FileOutputStream("BecityAvatar.png");
image.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
The thing is, I want to store the image so when the profile launches and the layout is loaded, if there is an image stored as the avatar, it loads itself onto the imageview from the layout. If there isn't, nothing will happen. I don't really know where the images will get stored when I save them. Any help or tips will be appreciated.
Your problem is with:
out = new FileOutputStream("BecityAvatar.png");
this way you are creating a FileOutputStream, that points to /, and your application has not right to write there. For instance
File file = new File(getFilesDir(), "BecityAvatar.png")
out = new FileOutputStream(file);
to use getFilesDir(), you need a context
I am working on an image wallpaper application in android when i download the image from url sometime it shows images on mobile but most of time it does't show but when i connect my mobile to computer its right in the specified folder.
Thanks advance looking forward for answer.
Here is my code to download image.
protected Void doInBackground(Void... arg0) {
FileOutputStream fileOutput = null;
try {
// set the path where we want to save the file
// in this case, going to save it on the root directory of the
// sd card.
File dir = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
String filename = _imagePaths[FullScreenImage.position]
.substring(_imagePaths[FullScreenImage.position]
.lastIndexOf("/"));
if (!dir.exists())
dir.mkdirs();
File file = new File(dir, filename);
Log.i("Local filename:", "" + filename);
// this will be used to write the downloaded data into the file
// we created
fileOutput = new FileOutputStream(file);
Bitmap mybitmap = imageLoader.getBitmap(
_imagePaths[FullScreenImage.position], 800, 480);
mybitmap.compress(CompressFormat.JPEG, 100, fileOutput);
// close the output stream when done
// catch some possible errors...
} catch (IOException e) {
Log.e("Download Image catch > ", e.getMessage());
} finally {
if (fileOutput != null) {
try {
fileOutput.flush();
fileOutput.close();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("Download Image catch > ", e.getMessage());
}
}
}
return null;
}
Use MediaScannerConnection.scanFile() to notify the system about new media files.
i am working on OpenGl Es in android.given efects on images and when i save the image in sdcard it showing black image.how i solve this problem.
File cacheDir;
Toast.makeText(ImageProcessingActivity.this, "Photo", 500).show();
Bitmap icon;
frame.setDrawingCacheEnabled(true);
icon = Bitmap.createBitmap(frame.getDrawingCache());
Bitmap bitmap = icon;
frame.setDrawingCacheEnabled(false);
// File mFile1 = Environment.getExternalStorageDirectory();
Date d = new Date();
String fileName = d.getTime() + "mg1.jpg";
File storagePath = (Environment.getExternalStorageDirectory());
File dest = new File(storagePath + "/CityAppImages");
if (!dest.exists()) {
dest.mkdirs();
}
File mFile2 = new File(dest, fileName);
sdpath = mFile2.getAbsolutePath();
Log.d("qqqqqqqqqqqqqqqqqqqqqqq", "zzzzzzzz" + sdpath);
try {
FileOutputStream outStream;
outStream = new FileOutputStream(mFile2);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
Toast.makeText(ImageProcessingActivity.this, "Photo Saved Sucessfully", 500)
.show();
image.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(ImageProcessingActivity.this, "Photo Not Saved Sucessfully",500).show();
}
I had this problem once and it was because getDrawingCache is not what it should be. The problem is not the saving, is the way you do it.
From what I understand you want to capture the screen of your app, but this is very tricky and can cause a lot of problems.
Read this topic, since it helped me a lot when I had this problem.
How to programmatically take a screenshot in Android?
Edit:
Also, because you are using GLES and then printing the screen you should go to Settings > Developer Options > check Disable Hardware Overlays and Force GPU Rendering.
The idea of my app is to capture image from camera then crop specified area from it.
The problem :
When i save the cropped image in my sd card for the first time to launch the app, it saved properly. but when run my app one more time and take image then crop it. when save it the first image that take and crop at first time appear in the sd card not the current one.
This is my code for save images:
public static void save(Activity activity, Bitmap bm, String name) {
OutputStream outStream = null;
File externalFilesDir = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File outFile = new File(externalFilesDir, "IDOCR" + File.separator + "Numbers");
if (!outFile.exists())
outFile.mkdirs();
File number = new File(outFile, name + ".PNG");
//if (number.exists())
// number.delete();
try {
//outStream = new FileOutputStream(new File(path));
outStream = new FileOutputStream(number);
bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
outStream.flush();
outStream.close();
bm.recycle();
System.gc();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Maybe if you are trying to overwrite the previous version of the file, you should first delete the previous one...
You can add:
if (!outFile.exists())
outFile.mkdirs();
else {
outFile.delete();
outFile.createNewFile();
}