ذخیره عکس درون کارت حافظه (حل شد)
سلام.
من کل تاپیک ها درباره این موضوع رو گشتم ولی به جواب نرسیدم.
اگه میشه کمک کنید چطور عکسهای درون برنامه رو در کارت حافظه ذخیره کنم؟
برنامه گالری عکس هست که میخام یکی یکی به دلخواه کاربر ذخیره بشه!
خیلی ممنونم...
سلام .
اول توضیحاتش رو مینویسم بعد کدها .
Dir_SDCARD درواقع آدرس مموری رو پیدا میکنه .
DIR_MYFOLDER هم آدرسی هست که شما در ادامه آدرس مموری وارد میکنید تا فایلها اونجا کپی بشن .
HelperIO هم یه class هست واسه کپی کردن فایلها که باید این class رو به پروژه تون اضافه کنید .توی قسمت 2 از فصل 19 آموزشهای استاد این class توضیح داده شده و سورسش هست اگه ندارید براتون میذارم .
اون file که تعریف شده میشه اسم فایل بعد از کپی شدن در مموری .
در قسمت assetmanager.open باید اسم فایل اصلی که شما در پوشه assets پروژه تون کپی کردید باشه (دقت کن که عکسا باید در پوشه ی assets کپی شوند .
final String DIR_SDCARD = Environment.getExternalStorageDirectory()
.getAbsolutePath();
final String DIR_MYFOLDER = DIR_SDCARD + "/pictures/";
new File(DIR_MYFOLDER ).mkdirs();
File file = new File(DIR_MYFOLDER + "/"
+ "Myimage.jpg");
AssetManager assetmanager = G.context.getAssets();
InputStream inputstream;
try {
inputstream = assetmanager
.open("Image.jpg");
HelperIO.copyFile(inputstream, DIR_MYFOLDER + "/"
+ "Myimage.jpg");
} catch (Exception e) {
// TODO: handle exception
}
کلاس G چیزاییش که اینجا لازم هست رو نوشتم . توجه کنید که در manifest برنامه شما ، در قسمت application باید این کد رو اضافه کنید تا کلاس G رو بشناسه :
android:name=".G"
کلاس HelperIO رو هم نوشتم که باید به پروژه تون اضافه کنید .
public class G extends Application {
public static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
/////////////////////////////////////////////////////////////////////////////
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.nio.channels.FileChannel;
public class HelperIO {
public static void closeStream(InputStream stream) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void closeStream(OutputStream stream) {
try {
stream.flush();
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void closeChannel(FileChannel channel) {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void copyFile(String inputFilename, String outputFilename) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new FileInputStream(inputFilename);
outputStream = new FileOutputStream(outputFilename);
copyFile(inputStream, outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
closeStream(inputStream);
closeStream(outputStream);
}
}
public static void copyFile(String inputFilename, OutputStream outputStream) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(inputFilename);
copyFile(inputStream, outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
closeStream(inputStream);
closeStream(outputStream);
}
}
public static void copyFile(InputStream inputStream, String outputFilename) {
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(outputFilename);
copyFile(inputStream, outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
closeStream(inputStream);
closeStream(outputStream);
}
}
public static void copyFile(InputStream inputStream,
OutputStream outputStream) {
byte[] buffer = new byte[8 * 1024];
int lenRead = 0;
try {
while ((lenRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, lenRead);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
closeStream(inputStream);
closeStream(outputStream);
}
}
}
برای بررسی وجود sdcard میتونی از این کد استفاده کنی.
publicstaticfinalString DIR_SDCARD =/storage/sdcard1;
File sdDirectory =newFile(DIR_SDCARD);
if(sdDirectory.listFiles()!=null){
Log.i("LOG","sdcard exist");
}else{
Log.i("LOG","sdcard not exist");
}
چطور بفهمیم حافظه داخلی یا خارجی پر هست رو نمیدونم
برای انتخاب عکس از گالری میتونید از کد زیر استفاده کنید:
Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, PICK_FROM_GALLERY);
برای گرفتن آدرس عکس هم از کد زیر:
String filePath;
final int PICK_FROM_GALLERY = 2;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_FROM_GALLERY && resultCode == RESULT_OK && data != null) {
Uri uri = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
cursor.close();
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .