天天看點

利用MediaStore檢索圖像+利用ExitInterface修改EXIF資訊

利用MediaStore檢索圖像

由于ContentProvider(目前為MediaStore)在應用程式之間是共享的,且大多數應用程式預設使用MediaStore,是以可以利用它來建立自己的圖像庫應用程式。

MediaStore和所有的内容提供器都以一種類似資料庫的方式運作。從它們中選擇記錄,獲得一個Cursor對象,并通過它來周遊結果。

1.首先建立一個打算傳回列的字元串數組。對于MediaStore中的圖像,其标準列在MediaStore.Images.Media類表示。

String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};      

2.使用activity的managedQuery方法執行查詢,第一個參數是Uri,然後是列名稱的數組,後跟WHERE子句和WHERE子句的任何參數,最後是ORDER BY子句。

long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
String[] whereValues={""+oneHourAgo};
cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");      

3.  傳回的遊标會告訴我們目前選擇的每個列的索引

displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);      

示例代碼: 

public class MediaStoreGallery extends Activity
{
    public final static int DISPLAYWIDTH=200;
    public final static int DISPLAYHEIGHT=200;
    TextView titleTextView;
    ImageButton imageButton;
    Cursor cursor;
    Bitmap bmp;
    String imageFilePath;
    int fileColumn;
    int titleColumn;
    int displayColumn;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        titleTextView=(TextView)this.findViewById(R.id.TitleTextView);
        imageButton=(ImageButton)this.findViewById(R.id.ImageButton);
        
        String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};
        cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,null,null,null);
        
//      long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
//      String[] whereValues={""+oneHourAgo};
//      cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,
//              Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");
        
        fileColumn=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        titleColumn=cursor.getColumnIndexOrThrow(Media.TITLE);//可簡寫成
        displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);
        
        if(cursor.moveToFirst())
        {
            titleTextView.setText(cursor.getString(titleColumn));
            imageFilePath=cursor.getString(fileColumn);
            bmp=getBitmap(imageFilePath);
            imageButton.setImageBitmap(bmp);
        }
        
        imageButton.setOnClickListener(new OnClickListener()
        {
 
            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                if(cursor.moveToNext())
                {
                    titleTextView.setText(cursor.getString(titleColumn));
                    imageFilePath=cursor.getString(fileColumn);
                    bmp=getBitmap(imageFilePath);
                    imageButton.setImageBitmap(bmp);
                }
            }
            
        });
    }
    
    private Bitmap getBitmap(String imageFilePath)
    {
        
//      加載圖像的尺寸而不是圖像本身
            BitmapFactory.Options bmpFactoryOptions=new BitmapFactory.Options();
            bmpFactoryOptions.inJustDecodeBounds=true;
            Bitmap bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
            
            int heightRatio=(int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);
            int widthRatio=(int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);
            Log.v("HEIGHT RATIO",""+heightRatio);
            Log.v("WIDTH RATIO",""+widthRatio);
            
//      如果兩個比率都大于1,那麼圖像的一條邊将大于螢幕
            if(heightRatio>1&&widthRatio>1)
            {
                if(heightRatio>widthRatio)
                {
//              如果高度比率更大,則根據它縮放
                    bmpFactoryOptions.inSampleSize=heightRatio;
                }
                else
                {
//              若寬度比率更大,則根據它縮放
                    bmpFactoryOptions.inSampleSize=widthRatio;
                }
            }
//      對它進行真正的解碼
            bmpFactoryOptions.inJustDecodeBounds=false;
            bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
            return bmp;     
    }
}      

利用ExitInterface修改EXIF資訊

1.EXIF 表示可交換的圖像檔案格式,它是在圖像檔案中儲存中繼資料的一種标準方式。一般大多數标記與所捕獲圖像本身的資料相關,如ExposureTime和ShutterSpeedValue。

然而,有一些标記可以考慮填寫或修改。

UserComment:由使用者生成的備注

ImageDescription:标題

Artist:圖像的建立者或接受者

Copyright:圖像的版權持有人

Software:用于建立圖像的軟體

Android為我們提供了一種讀寫EXIF資料的方法,該方法的主要類是ExifInterface。

示例代碼:

//如何使用ExifInterface從一個圖像檔案讀取特定的EXIF資料
ExifInterface ei=new ExifInterface(imageFilePath);
String imageDescription=ei.getAttribute("ImageDescription");
if(imageDescription!=null)
{
    Log.v("EXIF",imageDescription);
}
//如何使用ExifInterface将EXIF資料儲存到圖像檔案中
ei.setAttribute("ImageDescription","Something New");