編輯:Android開發實例
在多媒體應用中,Image是最基礎的功能模塊,接下來我們將看看在Android中是如何獲取和存儲Image的。Android內嵌的Image獲取和存儲功能,可以讓我們對於整個媒體框架有個比較全面的了解,同時為audio和video的學習打下基礎。
一、Image的獲取可以通過調Android自帶的Camera應用來完成。該應用含有一個Intent-Filter。通過使用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent)就可以啟動Camera應用了。
二、Image存儲,Android系統中含有一個多媒體庫,其中包括所有Image、Video、Audio的數據。通過MediaStore對象可以訪問相關數據。
閒話少說,直接看例子,這是一本英文書上的,覺得寫的很好,自己翻譯了一下,並加入了很多注釋。以備查詢。
- package demo.camera;
- import java.io.File;
- import android.app.Activity;
- import android.content.ContentValues;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Environment;
- import android.provider.MediaStore;
- import android.util.Log;
- import android.view.Display;
- import android.view.View;
- import android.widget.Button;
- import android.widget.ImageView;
- /**
- * 這裡多媒體第一個示例,主要介紹Image的獲取和存儲
- * Image的獲取可以通過Android自帶的Camera應用來獲得,
- * 圖片的存儲需要用到MediaStore對象。Android中的多媒體庫。
- *
- * @author Administrator
- *
- */
- public class MainActivity extends Activity {
- private static final int RESULT_CODE = 1;
- private Button btnCamera;
- private ImageView imageView;
- private Uri imageFilePath;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- imageView = (ImageView)this.findViewById(R.id.imageView);
- btnCamera = (Button)this.findViewById(R.id.camera);
- btnCamera.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- /**
- * 由於Camara返回的是縮略圖,我們可以傳遞給他一個參數EXTRA_OUTPUT,
- * 來將用Camera獲取到的圖片存儲在一個指定的URI位置處。
- * 下面就指定image存儲在SDCard上,並且文件名為123.jpg
- * imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"123.jpg";
- * File file = new File(imageFilePath); //創建一個文件
- * Uri imageUri = Uri.fromFile(file);
- * 然而Android已經提供了一個多媒體庫,那裡統一存放了設備上所有的多媒體數據。所以,
- * 我們可以將獲取到的圖片存放在那個多媒體庫中。
- * Android提供了MediaStore類,該類是一個ContentProvider,管理著設備上自帶的和外部的多媒體文件,
- * 同時包含著每一個多媒體文件的數據信息。
- * 為了將數據存儲在多媒體庫,使用ContentResolver對象來操縱MediaStore對象
- * 在MediaStore.Images.Media中有兩個URI常量,一個是 EXTERNAL_CONTENT_URI,另一個是INTERNAL_CONTENT_URI
- * 第一個URI對應著外部設備(SDCard),第二個URI對應著系統設備內部存儲位置。
- * 對於多媒體文件,一般比較大,我們選擇外部存儲方式
- * 通過使用ContentResolver對象的insert方法我們可以向MediaStore中插入一條數據
- * 這樣在檢索那張圖片的時候,不再使用文件的路徑,而是根據insert數據時返回的URI,獲取一個InputStream
- * 並傳給BitmapFactory
- */
- //在這裡啟動Camera。
- //Camera中定義了一個Intent-Filter,其中Action是android.media.action.IMAGE_CAPTURE
- //我們使用的時候,最好不要直接使用這個,而是用MediaStore中的常量ACTION_IMAGE_CAPTURE.
- //這個常量就是對應的上面的action
- Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- //這裡我們插入一條數據,ContentValues是我們希望這條記錄被創建時包含的數據信息
- //這些數據的名稱已經作為常量在MediaStore.Images.Media中,有的存儲在MediaStore.MediaColumn中了
- //ContentValues values = new ContentValues();
- ContentValues values = new ContentValues(3);
- values.put(MediaStore.Images.Media.DISPLAY_NAME, "testing");
- values.put(MediaStore.Images.Media.DESCRIPTION, "this is description");
- values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
- imageFilePath = MainActivity.this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
- intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFilePath); //這樣就將文件的存儲方式和uri指定到了Camera應用中
- //由於我們需要調用完Camera後,可以返回Camera獲取到的圖片,
- //所以,我們使用startActivityForResult來啟動Camera
- startActivityForResult(intent, RESULT_CODE);
- }
- });
- }
- /**
- * 為了獲取Camera返回的圖片信息,重寫該方法。
- */
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data){
- super.onActivityResult(requestCode, resultCode, data);
- if(resultCode == RESULT_CODE){
- //說明是由Camera返回的數據
- //由Camera應用返回的圖片數據是一個Camera對象,存儲在一個名為data的extra域
- //然後將獲取到的圖片存儲顯示在ImageView中
- try {
- Bundle extra = data.getExtras();
- /**
- * 然而為了節約內存的消耗,這裡返回的圖片是一個121*162的縮略圖。
- * 那麼如何返回我們需要的大圖呢?看上面
- * 然而存儲了圖片。有了圖片的存儲位置,能不能直接將圖片顯示出來呢》
- * 這個問題就設計到對於圖片的處理和顯示,是非常消耗內存的,對於PC來說可能不算什麼,但是對於手機來說
- * 很可能使你的應用因為內存耗盡而死亡。不過還好,Android為我們考慮到了這一點
- * Android中可以使用BitmapFactory類和他的一個內部類BitmapFactory.Options來實現圖片的處理和顯示
- * BitmapFactory是一個工具類,裡面包含了很多種獲取Bitmap的方法。BitmapFactory.Options類中有一個inSampleSize,比如設定他的值為8,則加載到內存中的圖片的大小將
- * 是原圖片的1/8大小。這樣就遠遠降低了內存的消耗。
- * BitmapFactory.Options op = new BitmapFactory.Options();
- * op.inSampleSize = 8;
- * Bitmap pic = BitmapFactory.decodeFile(imageFilePath, op);
- * 這是一種快捷的方式來加載一張大圖,因為他不用考慮整個顯示屏幕的大小和圖片的原始大小
- * 然而有時候,我需要根據我們的屏幕來做相應的縮放,如何操作呢?
- *
- */
- //首先取得屏幕對象
- Display display = this.getWindowManager().getDefaultDisplay();
- //獲取屏幕的寬和高
- int dw = display.getWidth();
- int dh = display.getHeight();
- /**
- * 為了計算縮放的比例,我們需要獲取整個圖片的尺寸,而不是圖片
- * BitmapFactory.Options類中有一個布爾型變量inJustDecodeBounds,將其設置為true
- * 這樣,我們獲取到的就是圖片的尺寸,而不用加載圖片了。
- * 當我們設置這個值的時候,我們接著就可以從BitmapFactory.Options的outWidth和outHeight中獲取到值
- */
- BitmapFactory.Options op = new BitmapFactory.Options();
- //op.inSampleSize = 8;
- op.inJustDecodeBounds = true;
- //Bitmap pic = BitmapFactory.decodeFile(imageFilePath, op);//調用這個方法以後,op中的outWidth和outHeight就有值了
- //由於使用了MediaStore存儲,這裡根據URI獲取輸入流的形式
- Bitmap pic = BitmapFactory.decodeStream(this
- .getContentResolver().openInputStream(imageFilePath),
- null, op);
- int wRatio = (int) Math.ceil(op.outWidth / (float) dw); //計算寬度比例
- int hRatio = (int) Math.ceil(op.outHeight / (float) dh); //計算高度比例
- Log.v("Width Ratio:", wRatio + "");
- Log.v("Height Ratio:", hRatio + "");
- /**
- * 接下來,我們就需要判斷是否需要縮放以及到底對寬還是高進行縮放。
- * 如果高和寬不是全都超出了屏幕,那麼無需縮放。
- * 如果高和寬都超出了屏幕大小,則如何選擇縮放呢》
- * 這需要判斷wRatio和hRatio的大小
- * 大的一個將被縮放,因為縮放大的時,小的應該自動進行同比率縮放。
- * 縮放使用的還是inSampleSize變量
- */
- if (wRatio > 1 && hRatio > 1) {
- if (wRatio > hRatio) {
- op.inSampleSize = wRatio;
- } else {
- op.inSampleSize = hRatio;
- }
- }
- op.inJustDecodeBounds = false; //注意這裡,一定要設置為false,因為上面我們將其設置為true來獲取圖片尺寸了
- pic = BitmapFactory.decodeStream(this.getContentResolver()
- .openInputStream(imageFilePath), null, op);
- imageView.setImageBitmap(pic);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
先明確幾個概念的區別: padding margin都是邊距的含義,關鍵問題得明白是什麼相對什麼的邊距. padding是控件的內容相對控件的邊緣的邊距. mar
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用