Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Developers:簡單的拍照

Android Developers:簡單的拍照

編輯:關於Android編程

這個課程說明如何使用一個已存在的相機程序來捕捉照片。

假設你實現了一個眾包的天氣服務,它讓一個全球的天氣地圖和由設備運行你的客戶端程序拍攝的天空照片結合。結合照片僅僅是你的應用程序的一小部分。你想拍照用最小的煩惱,不重新開發照相機。幸運的是,大多數Android設備已經按照了至少一個照相機應用程序。在這個課程,你將會學習如何使用它給你拍照片。

請求照相機權限

————————————————————————————————————————————————————————————————

如果你的應用程序的基本功能是拍照,然後再Google Play對於有照相機的設備限制它的可見性。為了告知你的應用程序基於一個相機,在你的清單文件中放置一個標識:

 
    
   ... 
 
如果你的應用程序使用,但是為了運行不要求一個相機,在標簽中添加android:required=”false”。在這種情況下,Google Play將允許沒有照相機的設備下載你的應用程序。這是你的職責,通過調用hasSystemFeature(PackageManager.FEATURE_CAMERA)方法在運行時檢查相機功能。如果一個相機是不可用的,然後你應該禁止你的相機功能。

使用相機應用拍照

————————————————————————————————————————————————————————————————

Android委派動作給其它應用程序的方式是調用一個Intent,它描述你想要做什麼。這個過程包含三部分:這個Intent自己,一個調用啟動外部Activity,和要求返回你的Activity的時候一些處理圖片數據的代碼。

這裡是一個功能,調用一個Intent在捕捉相片。

private void dispatchTakePictureIntent(int actionCode) { 
   Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
   startActivityForResult(takePictureIntent, actionCode); 
} 
恭喜:使用這個代碼,你的應用程序獲取了是其它相機應用程序為你服務的能力!當然,如果沒有合適的應用程序准備捕獲這個Intent,那麼你的 應用程序將會崩潰。下面是一個功能,檢查是否有一個應用程處理你的Intent:

public static boolean isIntentAvailable(Context context, String action) { 
   final PackageManager packageManager = context.getPackageManager(); 
   final Intent intent = new Intent(action); 
   List list = 
           packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
   return list.size() > 0; 
} 

查看照片

————————————————————————————————————————————————————————————————

如果簡單的拍攝照片的能力不是你的應用程序的最終目的,那麼你獲取想從這個相機應用程序獲取照片,並做些什麼。

Android相機應用個程序在返回的Intent中編碼這個相片,作為一個小的位圖附件分發給onActivityResult()方法。在“data”關鍵字之下。下面的代碼獲取這個照片,並在 一個ImageView中顯示。

private void handleSmallCameraPhoto(Intent intent) { 
   Bundle extras = intent.getExtras(); 
   mImageBitmap = (Bitmap) extras.get("data"); 
   mImageView.setImageBitmap(mImageBitmap); 
} 
注意:從”data“獲取的極小的圖片可能適合用作一個圖標,但是不是很多,處理一個全尺寸的圖片需要更多的工作。

保存圖片
————————————————————————————————————————————————————————————————

Android相機應用程序保存一個完整大小的圖片,如果你給它一個文件來保存。你必須提供一個路徑,它包含存儲空間,文件夾,和文件名。

這裡是一個簡單的方式來為相片獲取路徑,但是它僅僅工作在Android2.2(API level 8)和更晚的平台:

storageDir = new File( 
   Environment.getExternalStoragePublicDirectory( 
       Environment.DIRECTORY_PICTURES 
   ),  
   getAlbumName() 
);  
對於更早的API級別,你必須自己提供相片目錄的名字。

storageDir = new File ( 
   Environment.getExternalStorageDirectory() 
       + PICTURES_DIR 
       + getAlbumName() 
); 
注意:路徑的組件PICTURES_DIR僅僅是Pictures/,在外部/共享存儲標准的共享照片路徑。

設置文件名

—————————————————————————————————————————————————————————————————

如前面的章節顯示的,圖片文件的位置應該有具體的設備環境決定。你自己需要做的是選擇一個抗突發性的文件命名策略。你可能也希望在一個成員保量中保存路徑給以後使用。這裡是一個解決案例:

private File createImageFile() throws IOException { 
   // Create an image file name 
   String timeStamp =  
       new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
   String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; 
   File image = File.createTempFile( 
       imageFileName,  
       JPEG_FILE_SUFFIX,  
       getAlbumDir() 
   ); 
   mCurrentPhotoPath = image.getAbsolutePath(); 
   return image; 
}  

在Intent中追加文件名

—————————————————————————————————————————————————————————————————

一旦你有一個地方在保存你的圖片,通過Intent傳遞給照相機應用程序這個位置。

File f = createImageFile(); 
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 

在一個畫廊中添加照片

—————————————————————————————————————————————————————————————————

當你通過一個Intent創建一個照片的時候,你應該知道你的照片被放在什麼位置,因為你說了在哪裡首先保存它。對於其它人,可能更早使你的照片可訪問的方式是,使它系統的Media Provider可訪問。

下面例子方法演示了如何調用系統的媒體掃描器來將你的照片添加到Media Provider的數據庫中,使它在Android的畫廊應用程序和其它應用程序中有效。

private void galleryAddPic() { 
   Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
   File f = new File(mCurrentPhotoPath); 
   Uri contentUri = Uri.fromFile(f); 
   mediaScanIntent.setData(contentUri); 
   this.sendBroadcast(mediaScanIntent); 
} 

編碼一個縮放的圖片

—————————————————————————————————————————————————————————————————

管理多個完整大小的圖片會是先限制的內存大小變得棘手。如果你發現你的應用程序在僅僅顯示一些圖片的時候就耗盡內存,你能通過將已經縮放匹配目標視圖大小的JPEG圖片到一個內存數組中,來顯著減少動態棧使用。下面的例子方法演示了這個技術:

private void setPic() { 
   // Get the dimensions of the View 
   int targetW = mImageView.getWidth(); 
   int targetH = mImageView.getHeight(); 
  
   // Get the dimensions of the bitmap 
   BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
   bmOptions.inJustDecodeBounds = true; 
   BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
   int photoW = bmOptions.outWidth; 
   int photoH = bmOptions.outHeight; 
  
   // Determine how much to scale down the image 
   int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 
  
   // Decode the image file into a Bitmap sized to fill the View 
   bmOptions.inJustDecodeBounds = false; 
   bmOptions.inSampleSize = scaleFactor; 
   bmOptions.inPurgeable = true; 
  
   Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
   mImageView.setImageBitmap(bitmap); 
} 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved