PDA

View Full Version : نحوه ذخیره تصاویر در حافظه جانبی SD



hamedg1366
جمعه 18 مهر 1393, 09:33 صبح
با عرض سلام وخسته نباشید

دوستان عکس های دریافتی از سرور رو چطور توی حافظه جانبی ذخیره کنم طوری که یه پوشه بنام برنامه ایجاد کنه و عکس ها رو توش بریزه و بخونه

(منظورم کش دستگاه نیس)

با تشکر از همتون

StoPpeR
جمعه 18 مهر 1393, 12:03 عصر
بهتره معمولا همراه با سوال، کدی که تا الان نوشتین رو هم قرار بدین تا بفهمیم که تا کجا پیش رفتین و بشه بهتر کمکتون کرد
مثلا برای کار شما تقریبا این مراحل باید طی بشه:
ساخت فضای کلی برنامه - نوشتن کد های مربوط به چک کردن اینترنت و همچنین فعال بودن سرور - نوشتن کد دانلود تصویر از سرور - تهیه یک Bitmap از تصویر - ذخیره Bitmap روی sdCard - لود Bitmap روی یک Imageview

حالا توی هر کدوم از مراحل بالا که مشکل دارین بگین تا کمکتون کنیم

hamedg1366
جمعه 18 مهر 1393, 12:49 عصر
تشکر میکنم بابت جوابتون

با کد زیر یه تصویر رو از اینترنت می خونم و توی ایمیج ویو نمایش میدم ، راستش میخوام چندتا تصویر رو بگیرم و توی لیست ویو نمایش بدم ...




public class Load_pic extends Activity {

ImageView image;
ProgressBar spinner;
TextView message;
String path;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.load_pic);

image=(ImageView) findViewById(R.id.imageView1);
spinner=(ProgressBar)findViewById(R.id.progressBar 1);
message=(TextView)findViewById(R.id.textView1);
spinner.setVisibility(View.INVISIBLE);
displayImage();
}

private class DownloadImage extends AsyncTask<String, Void,Bitmap >
{
Bitmap bitmap;
String error_messsage="No error";
@Override
protected Bitmap doInBackground(String... urls) {

for(String url:urls){

HttpUriRequest request = new HttpGet(url.toString());
HttpClient httpClient = new DefaultHttpClient();
try {
HttpResponse response = httpClient.execute(request);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
byte[] bytes = EntityUtils.toByteArray(entity);
Log.e("here",""+bytes.length);
bitmap = BitmapFactory.decodeByteArray(bytes, 0,bytes.length);
Thread.sleep(2000);
}
else
{
error_messsage="Download failed, HTTP response code "+ statusCode + " - " + statusLine.getReasonPhrase();
}
} catch (Exception er) {
Log.e("Error",""+er);
}}


//image.setImageBitmap(bitmap);
return bitmap ;
}


@Override
protected void onPostExecute(Bitmap result) {
spinner.setVisibility(View.INVISIBLE);
image.setImageBitmap(result);

}
}
public void displayImage()
{

new DownloadImage().execute("http://www.harir.aynet.ir/c.jpg");

spinner.setVisibility(View.VISIBLE);

}
}

hamedg1366
جمعه 18 مهر 1393, 13:19 عصر
بهترین لینکی که برای این کار پیدا کردم اینجا میذارم ، مشکلم توی درک کد هاست

http://stackoverflow.com/questions/15549421/how-to-download-and-save-an-image-in-android

:::::::::::::::::::::::::::::::::::


برای لود توی کش مموری هم اینارو دارم بازم مشکلم توی درک کد هاست ،

Image Loader


package com.fedorvlasov.lazylist;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.os.Handler;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

public class ImageLoader {

MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
Handler handler=new Handler();

public ImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}

final int stub_id=R.drawable.stub;
public void DisplayImage(String url, ImageView imageView)
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
else
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}

private void queuePhoto(String url, ImageView imageView)
{
PhotoToLoad p=new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}

private Bitmap getBitmap(String url)
{
File f=fileCache.getFile(url);

Bitmap b = decodeFile(f);
if(b!=null)
return b;

try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex){
ex.printStackTrace();
if(ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}

private Bitmap decodeFile(File f){
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1=new FileInputStream(f);
BitmapFactory.decodeStream(stream1,null,o);
stream1.close();

final int REQUIRED_SIZE=70;
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}

BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
FileInputStream stream2=new FileInputStream(f);
Bitmap bitmap=BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}

private class PhotoToLoad
{
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i){
url=u;
imageView=i;
}
}

class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad){
this.photoToLoad=photoToLoad;
}

@Override
public void run() {
try{
if(imageViewReused(photoToLoad))
return;
Bitmap bmp=getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if(imageViewReused(photoToLoad))
return;
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
handler.post(bd);
}catch(Throwable th){
th.printStackTrace();
}
}
}

boolean imageViewReused(PhotoToLoad photoToLoad){
String tag=imageViews.get(photoToLoad.imageView);
if(tag==null || !tag.equals(photoToLoad.url))
return true;
return false;
}

class BitmapDisplayer implements Runnable
{
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
public void run()
{
if(imageViewReused(photoToLoad))
return;
if(bitmap!=null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(stub_id);
}
}

public void clearCache() {
memoryCache.clear();
fileCache.clear();
}

}






FileCache



package com.fedorvlasov.lazylist;

import java.io.File;
import android.content.Context;

public class FileCache {

private File cacheDir;

public FileCache(Context context){
if (android.os.Environment.getExternalStorageState(). equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDire ctory(),"LazyList");
else
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}

public File getFile(String url){
String filename=String.valueOf(url.hashCode());
File f = new File(cacheDir, filename);
return f;

}

public void clear(){
File[] files=cacheDir.listFiles();
if(files==null)
return;
for(File f:files)
f.delete();
}

}



MemoryCache

package com.fedorvlasov.lazylist;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import android.graphics.Bitmap;
import android.util.Log;

public class MemoryCache {

private static final String TAG = "MemoryCache";
private Map<String, Bitmap> cache=Collections.synchronizedMap(
new LinkedHashMap<String, Bitmap>(10,1.5f,true));
private long size=0;
private long limit=1000000;

public MemoryCache(){
setLimit(Runtime.getRuntime().maxMemory()/4);
}

public void setLimit(long new_limit){
limit=new_limit;
Log.i(TAG, "MemoryCache will use up to "+limit/1024./1024.+"MB");
}

public Bitmap get(String id){
try{
if(!cache.containsKey(id))
return null;
return cache.get(id);
}catch(NullPointerException ex){
ex.printStackTrace();
return null;
}
}

public void put(String id, Bitmap bitmap){
try{
if(cache.containsKey(id))
size-=getSizeInBytes(cache.get(id));
cache.put(id, bitmap);
size+=getSizeInBytes(bitmap);
checkSize();
}catch(Throwable th){
th.printStackTrace();
}
}

private void checkSize() {
Log.i(TAG, "cache size="+size+" length="+cache.size());
if(size>limit){
Iterator<Entry<String, Bitmap>> iter=cache.entrySet().iterator();//least recently accessed item will be the first one iterated
while(iter.hasNext()){
Entry<String, Bitmap> entry=iter.next();
size-=getSizeInBytes(entry.getValue());
iter.remove();
if(size<=limit)
break;
}
Log.i(TAG, "Clean cache. New size "+cache.size());
}
}

public void clear() {
try{
cache.clear();
size=0;
}catch(NullPointerException ex){
ex.printStackTrace();
}
}

long getSizeInBytes(Bitmap bitmap) {
if(bitmap==null)
return 0;
return bitmap.getRowBytes() * bitmap.getHeight();
}
}

StoPpeR
جمعه 18 مهر 1393, 14:11 عصر
علاوه بر اون لینکی که دارید ازین آموزش هم می تونید استفاده کنید:
www.androidhive.info/2014/07/android-custom-listview-with-image-and-text-using-volley

که خب قسمت به قسمت هم توضیح داده

کلا منظورتون از درک کد ها رو نفهمیدم... اگه کاربرد دستوری رو نمی دونین خب از مرجع خود اندروید استفاده کنین یا مشخصا کدش رو قرار بدین که توضیح بدیم...