android图像存储之使用MediaStore

来源:互联网 发布:普拉达男包高仿淘宝店 编辑:程序博客网 时间:2024/05/16 09:03

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

activity_main.xml布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <RelativeLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content" >        <TextView            android:id="@+id/titleTView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/title" />        <EditText            android:id="@+id/titleEView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_toRightOf="@id/titleTView"            android:inputType="text" />    </RelativeLayout>    <ImageView        android:id="@+id/imgView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:contentDescription="@string/contentDescription" />    <RelativeLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content" >        <TextView            android:id="@+id/descriptionTView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/description" />        <EditText            android:id="@+id/descriptionEView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_toRightOf="@id/descriptionTView"            android:inputType="text" />    </RelativeLayout>    <RelativeLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content" >        <Button            android:id="@+id/take_pictureBtn"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="30dp"            android:text="@string/take_picture" />        <Button            android:id="@+id/saveBtn"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentRight="true"            android:layout_alignTop="@id/take_pictureBtn"            android:layout_marginRight="30dp"            android:text="@string/save" />    </RelativeLayout></LinearLayout>


strings.xml文件:

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">MediaStore</string>    <string name="action_settings">Settings</string>    <string name="hello_world">Hello world!</string>    <string name="title">Title:</string>    <string name="description">Description:</string>    <string name="save">Save</string>    <string name="take_picture">Take Picture</string>    <string name="contentDescription">contentDescription</string>    <string name="success">保存成功!</string></resources>


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;@Overrideprotected 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也就是CameratakePictureBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (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;}}});}@Overridepublic 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;}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.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);//獲取DefaultDisplayDisplay 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() {@Overridepublic 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 blocke.printStackTrace();}}}}


 

原创粉丝点击