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();}}}}
- android图像存储之使用MediaStore
- android 使用MediaStore检索图像
- MediaStore图像存储(笔记)
- Android之MediaStore使用的点点滴滴
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android教程之MediaStore
- Android之MediaStore
- Android 之 MediaStore
- Android教程之MediaStore
- hdu 4012 状态压缩BFS
- application和session的区别
- java基础知识2
- 数据结构作业1
- Boost 常用的库
- android图像存储之使用MediaStore
- 最长公共子串
- _cdecl和_stdcall的区别
- python初体验(1)基础篇
- 图像去雾--- 何凯明博士 ------- dark channel prior
- k路归并(败者树,记录败者)
- 贝加莱界面编程
- 将十进制数转换成二进制数的代码
- ZeroMQ研究与应用分析