View Full Version : بارگیری و ذخیره عکس لوکال در دیتابیس
slr560
یک شنبه 22 تیر 1393, 22:19 عصر
سلام دوستان
من ۲تا فرگمنت دارم . یکی برای ثبت نام و یکی برای نمایش اطلاعات
121086
سوالامو به دوبخش تقسیم میکنم.بخش اول:
نوع فیلد عکس در دیتا بیس رو چی در نظر بگیرم و سیو کنم؟
پسوند عکس باید چی باشه؟
میخوام وقتی روی عکس کلیک شد بره توی گالری و یه عکس انتخاب کنه و وقتی انتخای شد نمایش بده
با چه کدی باید این عکس رو از ImageView , بگیرم یا get کنم و در دیتا بیس دخیره کنم؟
بخش دوم:
3. با چه دستوری یا qury باید این عکس رو از دیتا بیس بگیرم؟
rubiks.kde
دوشنبه 23 تیر 1393, 00:16 صبح
نوع عکس در دیتابیس باید BLOB باشه و پسوند عکس هم مهم نیست ولی بهتره png و یا jpg باشه.
برای انتخاب عکس از گالری هم باید ابتدا با همچین intent گالری رو اجرا تا کاربر عکس رو انتخاب کنه
Intent intent = new Intent();intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent , "Select Picture"), PICK_IMAGE);
بعد از اون باید در onActivityResult منتظر باشی تا کاربر عکس رو انتخاب کنه و نتیجش در این تابع بیاد
private static final int PICK_IMAGE = 1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == PICK_IMAGE && data != null && data.getData() != null) {
Uri _uri = data.getData();
//User had pick an image.
Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DA TA }, null, null, null);
cursor.moveToFirst();
//Link to the image
final String imageFilePath = cursor.getString(0);
cursor.close();
}
super.onActivityResult(requestCode, resultCode, data);
}
حال بعد از اینکه کاربر عکس رو انتخاب کرد آدرس عکس در متغییر imageFilePath ذخیره شده است.
حال که آدرس رو دارید به راحتی اون رو به imageView میدید و همچنین برای ذخیره در دیتابیس به صورت باینری بخونید و ذخیره کنید و برای دریافت هم blob رو که باینری هست دریافت کنید و به عکس تبدیل کنید و بعد نمایش بدید.
قسمت دومتون هم کاری ندار مثال زیر رو بخونید.
این هم مثال کامل (http://www.coderzheaven.com/2012/12/23/store-image-android-sqlite-retrieve-it/) تمام کارهایی که میخواهید انجام بدید.
slr560
دوشنبه 23 تیر 1393, 01:29 صبح
نیاز به پرمیشن خاصی نداره؟
از کجا باید بفهمیم که چه موقع نیاز به پرمیشن داریم؟
توی logcat اخطار نمیده؟
slr560
دوشنبه 23 تیر 1393, 19:53 عصر
یه سوال دیگه
نوع داده ی ورودی که در متد Insert برای عکس باید در نظر بگیرم چیه؟
Bitmap ؟
وقتی با startActivityForResult یه عکس انتخاب میکنم خوده عکس رو برمیگردونه یا آدرسشو؟
rubiks.kde
سه شنبه 24 تیر 1393, 09:24 صبح
یه سوال دیگه
نوع داده ی ورودی که در متد Insert برای عکس باید در نظر بگیرم چیه؟
Bitmap ؟
وقتی با startActivityForResult یه عکس انتخاب میکنم خوده عکس رو برمیگردونه یا آدرسشو؟
معلومه نه کد رو خوندید و نه مثال رو و نه توضیحات منو.
گفتم ادرس عکس برمیگرده و شما عکس رو باید به byte تبدیل کنید
slr560
یک شنبه 29 تیر 1393, 19:11 عصر
الان فکر میکنم تصویر داخل دیتابیس دخیره شده
حالا میخوام بگیرمش که ارور میده .
متن قرمز رنگ ارور:
Process: ir.darabifard.daneshjo, PID: 3452 java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.darabifard.daneshjo/ir.darabifard.daneshjo.MainNavigation}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2225)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2274)
at android.app.ActivityThread.access$800(ActivityThre ad.java:141)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1202)
at android.os.Handler.dispatchMessage(Handler.java:10 2)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.jav a:5053)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at ir.darabifard.daneshjo.InfoFragment.onCreateView(I nfoFragment.java:69)
at android.app.Fragment.performCreateView(Fragment.ja va:1700)
at android.app.FragmentManagerImpl.moveToState(Fragme ntManager.java:890)
at android.app.FragmentManagerImpl.moveToState(Fragme ntManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.ja va:684)
at android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1447)
at android.app.Activity.performStart(Activity.java:53 21)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2188)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2274)
at android.app.ActivityThread.access$800(ActivityThre ad.java:141)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1202)
at android.os.Handler.dispatchMessage(Handler.java:10 2)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.jav a:5053)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:601)
at dalvik.system.NativeStart.main(Native Method)
این قسمت عکس رو از onActivityResult میگیره و در دیتا بیس ذخیره میکنه
//===========================Start get Picture=========================================== ======
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == selectedPicture) {
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
System.out.println("Image Path: " + selectedImagePath);
mImageView.setVisibility(View.VISIBLE);
mImageView.setImageURI(selectedImageUri);
}
}
}
@SuppressWarnings("deprecation")
public String getPath(Uri uri) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DAT A);
cursor.moveToFirst();
return cursor.getString(column_index);
}
protected byte[] saveImageDB() {
byte[] byteImage = null;
try {
FileInputStream instream = new FileInputStream(selectedImagePath);
BufferedInputStream bif = new BufferedInputStream(instream);
byteImage = new byte[bif.available()];
bif.read(byteImage);
} catch (Exception e) {
e.printStackTrace();
}
return byteImage;
این جایی هست که عکس رو از کرسر میگیرم. ایندکس عکسم توی دیتابیس ۱۰ هست
byte[] image= cursor.getBlob(10);
mImageView = (ImageView) rootView.findViewById(R.id.imageView_info_fragment );
Bitmap bmp = BitmapFactory.decodeByteArray(image, 0, image.length);
mImageView.setImageBitmap(bmp);
ارور دقیقا روی خطی هست که image.lenght رو فراخوانی میکنه. خط ۳ همین کد بالایی
نمیتونه طول آرایه بایت رو بگیره. مشکل کجاس؟
rubiks.kde
یک شنبه 29 تیر 1393, 20:14 عصر
شما NullPointerException دارید ببینید اصلا عکس ذخیره میشه.به درستی برمیگرده یا نه؟
slr560
یک شنبه 29 تیر 1393, 20:16 عصر
الان چک میکنم. حجم عکس یا اندازه عکس تاثیری نداره؟
من عکس در حد ۳۰۰ کیلوبایت گزاشتم.
slr560
یک شنبه 29 تیر 1393, 22:49 عصر
عکس ذخیره نمیشه تو دیتا بیس انگار. حدس میزنم از متد saveImageDB باشه
کسی از دوستان نظری نداره؟
alias136790
یک شنبه 29 تیر 1393, 23:57 عصر
این لینک کار با عکس تو دیتابیس:
http://stackoverflow.com/questions/10831151/how-to-store-and-retrieve-images-in-android-sqlite-database-and-display-them-on
slr560
دوشنبه 30 تیر 1393, 12:56 عصر
بازم نشد دوستان
من روش کارم فرق میکنه با اینا
طبق پست ۶ بالا من عکس رو میگیرم و میدمش به متد insertContact که یکی از ورودی هاش آرایه ای از نوع بایت هست. چرا دخیره نمیشه عکس من؟:ناراحت:
slr560
دوشنبه 30 تیر 1393, 23:26 عصر
آقا مشکل رو فهمیدم کجاس
توی این متد مقدار selectedImagePath خالی یا null هست. اما چرا؟؟:ناراحت:
public byte[] saveImageDB() {
byte[] byteImage = null;
try {
FileInputStream instream = new FileInputStream(selectedImagePath);
BufferedInputStream bif = new BufferedInputStream(instream);
byteImage = new byte[bif.available()];
bif.read(byteImage);
} catch (Exception e) {
e.printStackTrace();
}
return byteImage;
}
هر چی هست برمیگره به دستورات زیر .یکی این دستورات رو واسم توضیح میده؟
قابل فهم نیس متد پایین. اشتباه از کجاس؟
@SuppressWarnings("deprecation")
public String getPath(Uri uri) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DAT A);
cursor.moveToFirst();
return cursor.getString(column_index);
}
smemamian
سه شنبه 31 تیر 1393, 01:48 صبح
یه سوال:
چه اصراری هست شما خوده عکس رو در دیتابیس ذخیره کنید؟
شما کافیه یک آدرس رو ذخیره کنید، یا حتی یک کپی از تصویر بگیرید
و در پوشه مناسب ذخیره کنید و آدرس همون رو در دیتابیس ذخیره کنید.
device هر فرد برای همان فرد هستش و مشکلی از لحاظ پاک شدن و یا امنیت ندارید
که بخواهید همچین کاری انجام دهید.
ذخیره تصاویر به این صورت ، برای تصاویر کم حجم با تعداد کم مناسب.
alias136790
سه شنبه 31 تیر 1393, 02:06 صبح
الان عکس رو که از گالری انتخاب میکنین، تو imageview نمایش میده؟ این متغیر selectedImagePath مسیر عکس انتخاب شده رو میگیره، اون تابع getPath هم باز مسیر عکس انتخاب شده رو برمیگردونه.
slr560
سه شنبه 31 تیر 1393, 03:49 صبح
یه سوال:
چه اصراری هست شما خوده عکس رو در دیتابیس ذخیره کنید؟
شما کافیه یک آدرس رو ذخیره کنید، یا حتی یک کپی از تصویر بگیرید
و در پوشه مناسب ذخیره کنید و آدرس همون رو در دیتابیس ذخیره کنید.
device هر فرد برای همان فرد هستش و مشکلی از لحاظ پاک شدن و یا امنیت ندارید
که بخواهید همچین کاری انجام دهید.
ذخیره تصاویر به این صورت ، برای تصاویر کم حجم با تعداد کم مناسب.
والا این برنامه یه پروژه دانشجویی هست. واسه پایان ترمم. بهتر دیدم داخل دیتابیس دخیره کنم. اگه بخوام به صورت آدرس ذخیره کنم به چه صورته؟
الان عکس رو که از گالری انتخاب میکنین، تو imageview نمایش میده؟ این متغیر selectedImagePath مسیر عکس انتخاب شده رو میگیره، اون تابع getPath هم باز مسیر عکس انتخاب شده رو برمیگردونه.
آره عکس که انتخاب میشه با استفاده از onActivityResult مسیر عکس رو میگیره و نمایش داده میشه. اینارو میدونم که این واسه مسیره. یکیو میخوام بگه این ۴ تا خط بالا دقیقا چیکار میکنه؟؟
alias136790
سه شنبه 31 تیر 1393, 04:43 صبح
نمیدونم.
تو این لینکی که من گذاشتم، بجای استفاده از مسیر عکس از خود عکس با نوع drawable کار میکنی،
تابع های تبدیل هم گذاشته. یه تست بکن.
slr560
سه شنبه 31 تیر 1393, 12:40 عصر
آقا یافتم مشکل کجاس
بعد از ۲ ساعت سرچ توی stackoverflow فهمیدم که سیستم گرفتن مسیر توی اندروید ۴.۴ و ورژن های پایین تر فرق میکنه. از ورژن ۴ تا تا ۴.۳ با کد بالا کار میکنه ولی ۴.۴ نه
گفته بود انگار از InputStream واسه گرفتن مسیر استفاده کنید.
من همیشه روی اندروید ۴.۴ تست میکردم
بازم سرج میکنم ببینم چی به چیه
http://stackoverflow.com/questions/19985286/convert-content-uri-to-actual-path-in-android-4-4
slr560
سه شنبه 31 تیر 1393, 19:13 عصر
به نتیجه نرسیدم . :عصبانی++::عصبانی++:
از دوستان کسی نظری نداره واسه ۴.۴ چیکار باید بکنم؟
میگه مسیرو باید با استفاده از ContentResolver بگیرم . بازم نمیشه
طریقه گرفتن مسیر عکس توی ۴.۴ فرق میکنه
slr560
چهارشنبه 01 مرداد 1393, 00:29 صبح
هم اکنون نیازمند یاری سبزتان هستیم :)
slr560
چهارشنبه 01 مرداد 1393, 04:19 صبح
بلاخره حل شد دوستان . از لینک زیر کمک گرفتم
http://stackoverflow.com/questions/20260416/retrieve-absolute-path-when-select-image-from-gallery-kitkat-android
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.