Android Thumbnail from Gallery |
Android Thumbnail from Gallery ตัวอย่างการเขียน Android เพื่อแสดงภาพ Thumbnail ที่ถูกจัดเก็บไว้ในโปรแกรม Gallery ของ Android โดยทุกครั้งที่เราได้จัดเก็บรูปภาพไว้ในโฟเดอร์ต่าง ๆ ของ SD Card ตัวโปรแกรม Android จะค้นหาโฟเดอร์ต่าง ๆ ที่มีรูปภาพ และจะทำการสร้าง Thumbnail ภาพอัตโนมัติลงใน Database ของ Android เอง และเราสามารถเรียกข้อมูล Thumbnail มาใช้ได้เช่นเดียวกัน พื้นฐานทั่วไปเราสามารถเรียกภาพ Thumbnail และ Pah ของ Full Image ที่ถุกจัดเก็บไว้ในโฟเดอร์ต่าง ๆ
ภาพการแสดง Thumbnail ของ Gallery บน GridView
AndroidManifest.xml
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
เพิ่ม Permission นี้ลงในไฟล์ AndroidManifest.xml
ทดสอบเปิดโปรแกรม Gallery บน Android
คลิกที่ Gallery
แสดง Thumbnail ของ Gallery ที่ถูกจัดเก็บไว้ในฐานข้อมูลบนโปรแกรม Gallery
Example 1 ทดสอบการอ่านข้อมูล Thumbnail แบบง่าย ๆ
โครงสร้างของไฟล์ประกอบด้วย 2 ไฟล์คือ MainActivity.java, activity_main.xml
activity_main.xml
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:numColumns="4" >
</GridView>
</TableLayout>
MainActivity.java
package com.myapp;
import java.io.FileNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class MainActivity extends Activity {
private Cursor cur;
private int ImgColInx;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] Thumb = { MediaStore.Images.Thumbnails._ID };
cur = managedQuery(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, Thumb, null,
null, MediaStore.Images.Thumbnails.IMAGE_ID + "");
ImgColInx = cur.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
// gridView1
final GridView gView1 = (GridView)findViewById(R.id.gridView1);
gView1.setAdapter(new ImageAdapter(this));
// OnClick
gView1.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
String[] imgData = {MediaStore.Images.Media.DATA};
cur = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
imgData,null,null,null);
ImgColInx = cur.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cur.moveToPosition(position);
// Get Image Path
String imagePath = cur.getString(ImgColInx);
Toast.makeText(getApplicationContext(),
"Your selected : " + imagePath, Toast.LENGTH_SHORT).show();
}
});
}
public class ImageAdapter extends BaseAdapter
{
private Context context;
public ImageAdapter(Context c)
{
// TODO Auto-generated method stub
context = c;
}
public int getCount() {
// TODO Auto-generated method stub
return cur.getCount();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(context);
} else {
imageView = (ImageView) convertView;
}
// Postion Cursor
cur.moveToPosition(position);
int ImgID = cur.getInt(ImgColInx);
Bitmap bitmap,bitmapScale = null;
Uri uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + ImgID);
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
if (bitmap != null) {
bitmapScale = Bitmap.createScaledBitmap(bitmap, 80, 80, true);
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(8, 8, 8, 8);
imageView.setImageBitmap(bitmapScale);
bitmap.recycle();
bitmapScale.recycle();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return imageView;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Screenshot
แสดงภาพ Thumbnail จาก Galley
เมื่อคลิกที่ Thumbnail จะแสดง Path ที่เป็น Full Image เราสามารถเขียนเงื่อนไขอื่น ๆ เพื่อกระทำกับไฟล์นั้น ๆ ได้
Example 1.1 การใช้ Progress แสดงสถานะในขณะที่กำลังโหลดข้อมูลจาก Thunbmail
MainActivity.java
package com.myapp;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private GridView gidView;
private ImageAdapter imageAdapter;
ArrayList<HashMap<String, Object>> MyArrList = new ArrayList<HashMap<String, Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ProgressBar
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_main);
// gridView1 and imageAdapter
gidView = (GridView) findViewById(R.id.gridView1);
gidView.setClipToPadding(false);
imageAdapter = new ImageAdapter(getApplicationContext());
gidView.setAdapter(imageAdapter);
new LoadContentFromServer().execute();
}
class LoadContentFromServer extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
setProgressBarIndeterminateVisibility(true);
}
@Override
protected String doInBackground(String... params) {
String[] Thumb = { MediaStore.Images.Thumbnails._ID };
Cursor cur = managedQuery(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, Thumb, null,
null, MediaStore.Images.Thumbnails.IMAGE_ID + "");
int ImgColInx = cur.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
HashMap<String, Object> map;
int ImgID = 0;
for (int i = 0; i < cur.getCount(); i++) {
cur.moveToPosition(i);
ImgID = cur.getInt(ImgColInx);
Uri uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + ImgID);
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
if (bitmap != null) {
Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);
bitmap.recycle();
if (newBitmap != null) {
map = new HashMap<String, Object>();
map.put("ImageID", String.valueOf(ImgID));
map.put("ImageBitmap", (Bitmap)newBitmap);
MyArrList.add(map);
publishProgress(String.valueOf(i));
}
}
} catch (IOException e) {
e.getStackTrace();
}
}
cur.close();
return null;
}
@Override
public void onProgressUpdate(String... progress) {
imageAdapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(),String.valueOf(progress[0]), Toast.LENGTH_SHORT).show();
}
@Override
protected void onPostExecute(String unused) {
setProgressBarIndeterminateVisibility(false); // When Finish
}
}
class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context context) {
mContext = context;
}
public int getCount() {
return MyArrList.size();
}
public Object getItem(int position) {
return MyArrList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
} else {
imageView = (ImageView) convertView;
}
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(8, 8, 8, 8);
imageView.setImageBitmap((Bitmap)MyArrList.get(position).get("ImageBitmap"));
return imageView;
}
}
}
Screenshot
แสดง Progress Bar ที่ Title Bar ด้านบนขวา และแสดงผล Item ที่โหลดเรียบร้อยแล้ว
แสดงผลเรื่อย ๆ จนครบทุกตัว โดยไม่ต้องรอให้โหลดข้อมูลทั้งหมดแล้วค่อยแสดงผล
Example 1.2 ใช้ Progress แบบ Dialog แสดงสถานะการโหลดข้อมูล
MainActivity.java
package com.myapp;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class MainActivity extends Activity {
public static final int DIALOG_LOADING_PROGRESS = 0;
private ProgressDialog mProgressDialog;
private GridView gidView;
private ImageAdapter imageAdapter;
ArrayList<HashMap<String, Object>> MyArrList = new ArrayList<HashMap<String, Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ProgressBar
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_main);
// gridView1 and imageAdapter
gidView = (GridView) findViewById(R.id.gridView1);
gidView.setClipToPadding(false);
imageAdapter = new ImageAdapter(getApplicationContext());
gidView.setAdapter(imageAdapter);
new LoadContentFromServer().execute();
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_LOADING_PROGRESS:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Loading Gallery..");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
class LoadContentFromServer extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
setProgressBarIndeterminateVisibility(true);
showDialog(DIALOG_LOADING_PROGRESS);
}
@Override
protected String doInBackground(String... params) {
String[] Thumb = { MediaStore.Images.Thumbnails._ID };
Cursor cur = managedQuery(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, Thumb, null,
null, MediaStore.Images.Thumbnails.IMAGE_ID + "");
int ImgColInx = cur.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
HashMap<String, Object> map;
int ImgID = 0;
for (int i = 0; i < cur.getCount(); i++) {
cur.moveToPosition(i);
ImgID = cur.getInt(ImgColInx);
Uri uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + ImgID);
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
if (bitmap != null) {
Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);
bitmap.recycle();
if (newBitmap != null) {
map = new HashMap<String, Object>();
map.put("ImageID", String.valueOf(ImgID));
map.put("ImageBitmap", (Bitmap)newBitmap);
MyArrList.add(map);
publishProgress(String.valueOf((int)((i / (float) cur.getCount()) * 100)));
}
}
} catch (IOException e) {
e.getStackTrace();
}
}
cur.close();
return null;
}
@Override
public void onProgressUpdate(String... progress) {
imageAdapter.notifyDataSetChanged();
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String unused) {
setProgressBarIndeterminateVisibility(false); // When Finish
dismissDialog(DIALOG_LOADING_PROGRESS);
removeDialog(DIALOG_LOADING_PROGRESS);
}
}
class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context context) {
mContext = context;
}
public int getCount() {
return MyArrList.size();
}
public Object getItem(int position) {
return MyArrList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
} else {
imageView = (ImageView) convertView;
}
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(8, 8, 8, 8);
imageView.setImageBitmap((Bitmap)MyArrList.get(position).get("ImageBitmap"));
return imageView;
}
}
}
Screenshot
แสดง Progress Dialog ในขณะที่กำลังโหลดข้อมูลจาก Thunbmail
แสดงสถานะและเปอร์เซ็นต์การทำงาน
เมื่อทำงานเสร็จสิ้นแล้ว Dialog ก็จะหายไป
|
ช่วยกันสนับสนุนรักษาเว็บไซต์ความรู้แห่งนี้ไว้ด้วยการสนับสนุน Source Code 2.0 ของทีมงานไทยครีเอท
|
|
|
By : |
ThaiCreate.Com Team (บทความเป็นลิขสิทธิ์ของเว็บไทยครีเอทห้ามนำเผยแพร่ ณ เว็บไซต์อื่น ๆ) |
|
Score Rating : |
|
|
|
Create/Update Date : |
2012-07-03 17:18:31 /
2017-03-26 22:47:56 |
|
Download : |
No files |
|
Sponsored Links / Related |
|
|
|
|
|
|
|