Android實現獲取本機中所有圖片

fmms 12年前發布 | 53K 次閱讀 Android Android開發 移動開發

        本示例演示如何在Android中實現獲取本機中的所有圖片,并進行查看效果。

 

        在這個示例中,我使用android-support-v4.jar中的加載器來實現獲取本機中所有圖片,關于這個包在以前的文章中也提到,是一個非常有用的包,關于這個包的詳細信息請大家查看官方文檔:http://developer.android.com/sdk/compatibility-library.html。

 

        先讓我們看下本示例實現的效果圖:

        

        Android實現獲取本機中所有圖片 Android實現獲取本機中所有圖片

 

        項目結構圖如下所示:

        

        Android實現獲取本機中所有圖片

 

        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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!