android图像存储之使用MediaStore

学习过ContentProvider,对于图像(以及音频和视频)的标准内容提供器是MediaStore,MediaStore是在设备上的一个标准位置存放文件的设置,并且为存储和检索该文件的元数据提供便利。我们使用MediaStore来保存,而不需要在SDCard的某位置上来建立,这样是利于系统管理的。

activity_main.xml布局文件:



    

        

        
    

    

    

        

        
    

    

        


strings.xml文件:




    MediaStore
    Settings
    Hello world!
    Title:
    Description:
    Save
    Take Picture
    contentDescription
    保存成功!



MainActivity.java文件:

package cn.yh.mediastore;

import java.io.FileNotFoundException;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	private final static int CAMERA_RESULT = 0;
	private TextView titleTView, descriptionTView;
	private EditText titleEView, descriptionEView;
	private ImageView imgView;
	private Button takePictureBtn, saveBtn;
	private Uri imageFileUri;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//從佈局文件獲取對象
		titleTView = (TextView) findViewById(R.id.titleTView);
		titleEView = (EditText) findViewById(R.id.titleEView);
		descriptionTView = (TextView) findViewById(R.id.descriptionTView);
		descriptionEView = (EditText) findViewById(R.id.descriptionEView);
		imgView = (ImageView) findViewById(R.id.imgView);
		takePictureBtn = (Button) findViewById(R.id.take_pictureBtn);
		saveBtn = (Button) findViewById(R.id.saveBtn);
		//剛開始,除去takePictureBtn(Button)為可見之外,其他都設為不可見。
		titleTView.setVisibility(View.GONE);
		titleEView.setVisibility(View.GONE);
		descriptionTView.setVisibility(View.GONE);
		descriptionEView.setVisibility(View.GONE);
		imgView.setVisibility(View.GONE);
		saveBtn.setVisibility(View.GONE);
		//給takePictureBtn設置點擊事件,負責啟動android.provider.MediaStore.ACTION_IMAGE_CAPTURE也就是Camera
		takePictureBtn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				switch (v.getId()) {
				case R.id.take_pictureBtn:
					//獲取內容解析器,由於是新建一副圖像,所以使用insert方法,
					//Media.EXTERNAL_CONTENT_URI主要表明是放在外存儲設備,也就是SDCard而不是內存
					imageFileUri = getContentResolver().insert(
							Media.EXTERNAL_CONTENT_URI, new ContentValues());
					
					Intent intent = new Intent(
							android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
					
					intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
							imageFileUri);
					
					startActivityForResult(intent, CAMERA_RESULT);
					break;
				}
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_OK) {
			//設置拍照不可用
			takePictureBtn.setEnabled(false);
			//設置其他操作可見
			titleTView.setVisibility(View.VISIBLE);
			titleEView.setVisibility(View.VISIBLE);
			descriptionTView.setVisibility(View.VISIBLE);
			descriptionEView.setVisibility(View.VISIBLE);
			imgView.setVisibility(View.VISIBLE);
			saveBtn.setVisibility(View.VISIBLE);
			//獲取DefaultDisplay
			Display display = getWindowManager().getDefaultDisplay();
			int eh = titleEView.getHeight() + descriptionEView.getHeight();
			int bh = takePictureBtn.getHeight();
			int dh = display.getHeight() - eh - bh;
			int dw = display.getWidth();

			try {
				// 加载图像的尺寸,而不是图像本身。
				BitmapFactory.Options bmFactoryOptions = new Options();
				bmFactoryOptions.inJustDecodeBounds = true;
				Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
						.openInputStream(imageFileUri), null, bmFactoryOptions);
				int hRatio = (int) Math.ceil(bmFactoryOptions.outHeight
						/ (float) dh);
				int wRatio = (int) Math.ceil(bmFactoryOptions.outWidth
						/ (float) dw);
				// 判断是按高比率缩放还是宽比例缩放
				if (hRatio > 1 || wRatio > 1) {
					if (hRatio > wRatio) {
						bmFactoryOptions.inSampleSize = hRatio;
					} else {
						bmFactoryOptions.inSampleSize = wRatio;
					}
				}
				// 对图像进行真正的解码
				bmFactoryOptions.inJustDecodeBounds = false;
				bitmap = BitmapFactory.decodeStream(getContentResolver()
						.openInputStream(imageFileUri), null, bmFactoryOptions);
				imgView.setImageBitmap(bitmap);
				saveBtn.setOnClickListener(new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						//更新MediaStore中記錄的標題和描述
						ContentValues contentValues = new ContentValues();
						contentValues.put(Media.DISPLAY_NAME, titleEView.getText().toString());
						contentValues.put(Media.DESCRIPTION, descriptionEView.getText().toString());
						getContentResolver().update(imageFileUri, contentValues, null, null);
						//通知用戶
						Toast.makeText(MainActivity.this, R.string.success,
								Toast.LENGTH_LONG).show();
						Intent intent = new Intent(MainActivity.this, MainActivity.class);
						startActivity(intent);
					}
				});
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}


 

你可能感兴趣的:(android多媒体)