Android實現獲取本機中所有圖片
本示例演示如何在Android中實現獲取本機中的所有圖片,并進行查看效果。
在這個示例中,我使用android-support-v4.jar中的加載器來實現獲取本機中所有圖片,關于這個包在以前的文章中也提到,是一個非常有用的包,關于這個包的詳細信息請大家查看官方文檔:http://developer.android.com/sdk/compatibility-library.html。
先讓我們看下本示例實現的效果圖:
項目結構圖如下所示:
MyDevicePhotoActivity.java文件中代碼如下:
package com.device.photo; import android.app.Dialog; import android.content.ContentResolver; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v4.widget.SimpleCursorAdapter.ViewBinder; /** * Android實現獲取本機中所有圖片 * @Description: Android實現獲取本機中所有圖片 * @FileName: MyDevicePhotoActivity.java * @Package com.device.photo * @Author Hanyonglu * @Date 2012-5-10 下午04:43:55 * @Version V1.0 */ public class MyDevicePhotoActivity extends FragmentActivity implements LoaderCallbacks<Cursor>{ private Bitmap bitmap = null; private byte[] mContent = null; private ListView listView = null; private SimpleCursorAdapter simpleCursorAdapter = null; private static final String[] STORE_IMAGES = { MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.LATITUDE, MediaStore.Images.Media.LONGITUDE, MediaStore.Images.Media._ID }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView = (ListView)findViewById(android.R.id.list); simpleCursorAdapter = new SimpleCursorAdapter( this, R.layout.simple_list_item, null, STORE_IMAGES, new int[] { R.id.item_title, R.id.item_value}, ); simpleCursorAdapter.setViewBinder(new ImageLocationBinder()); listView.setAdapter(simpleCursorAdapter); // 注意此處是getSupportLoaderManager(),而不是getLoaderManager()方法。 getSupportLoaderManager().initLoader(0, null, this); // 單擊顯示圖片 listView.setOnItemClickListener(new ShowItemImageOnClickListener()); } @Override public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { // TODO Auto-generated method stub // 為了查看信息,需要用到CursorLoader。 CursorLoader cursorLoader = new CursorLoader( this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, STORE_IMAGES, null, null, null); return cursorLoader; } @Override public void onLoaderReset(Loader<Cursor> arg0) { // TODO Auto-generated method stub simpleCursorAdapter.swapCursor(null); } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) { // TODO Auto-generated method stub // 使用swapCursor()方法,以使舊的游標不被關閉. simpleCursorAdapter.swapCursor(cursor); } // 將圖片的位置綁定到視圖 private class ImageLocationBinder implements ViewBinder{ @Override public boolean setViewValue(View view, Cursor cursor, int arg2) { // TODO Auto-generated method stub if (arg2 == 1) { // 圖片經度和緯度 double latitude = cursor.getDouble(arg2); double longitude = cursor.getDouble(arg2 + 1); if (latitude == 0.0 && longitude == 0.0) { ((TextView)view).setText("位置:未知"); } else { ((TextView)view).setText("位置:" + latitude + ", " + longitude); } // 需要注意:在使用ViewBinder綁定數據時,必須返回真;否則,SimpleCursorAdapter將會用自己的方式綁定數據。 return true; } else { return false; } } } // 單擊項顯示圖片事件監聽器 private class ShowItemImageOnClickListener implements OnItemClickListener{ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub final Dialog dialog = new Dialog(MyDevicePhotoActivity.this); // 以對話框形式顯示圖片 dialog.setContentView(R.layout.image_show); dialog.setTitle("圖片顯示"); ImageView ivImageShow = (ImageView) dialog.findViewById(R.id.ivImageShow); Button btnClose = (Button) dialog.findViewById(R.id.btnClose); btnClose.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon(). appendPath(Long.toString(id)).build(); FileUtil file = new FileUtil(); ContentResolver resolver = getContentResolver(); // 從Uri中讀取圖片資源 try { mContent = file.readInputStream(resolver.openInputStream(Uri.parse(uri.toString()))); bitmap = file.getBitmapFromBytes(mContent, null); ivImageShow.setImageBitmap(bitmap); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } dialog.show(); } } }
FileUtil.java文件主要是對圖片資源的處理。代碼如下:
package com.device.photo; import java.io.ByteArrayOutputStream; import java.io.InputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /** * 文件操作類 * @Description: 文件操作類 * @FileName: FileUtil.java * @Package com.device.photo * @Author Hanyonglu * @Date 2012-5-10 下午01:37:49 * @Version V1.0 */ public class FileUtil { public FileUtil() { // TODO Auto-generated constructor stub } /** * InputStream to byte * @param inStream * @return * @throws Exception */ public byte[] readInputStream(InputStream inStream) throws Exception { byte[] buffer = new byte[1024]; int len = -1; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); outStream.close(); inStream.close(); return data; } /** * Byte to bitmap * @param bytes * @param opts * @return */ public Bitmap getBitmapFromBytes(byte[] bytes, BitmapFactory.Options opts) { if (bytes != null){ if (opts != null){ return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,opts); } else{ return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } } return null; } }最后,希望轉載的朋友能夠尊重作者的勞動成果,加上轉載地址:http://www.cnblogs.com/hanyonglu/archive/2012/05/10/2494908.html,謝謝。
本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!