iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
0
自我挑戰組

在Android Studio 3.x版開發Android系統的開發記事系列 第 9

在Android Studio 3.x版開發Android系統的開發記事-如何拍照並且儲存檔案

  • 分享至 

  • xImage
  •  
在現在的手機都有高畫質的攝錄鏡頭的設備,所以,使用者也會常常拍照。因此,了解如何開發拍照並且儲存檔案的程式也是很重要的。

目前開發App,主要都是直接啟動系統的相機元件來執行拍照的工作。它的系統Action名稱變數是「android.media.action.IMAGE_CAPTURE」,使用這個Action名稱建立好的Intent物件,可以呼叫putExtra方法加入照片檔案儲存位置的設定資料,來儲存檔案。資料變數為「MediaStore.EXTRA_OUTPUT」,都可以來範例中看到如何用年月日時分秒的字串,來儲存成檔案名稱。

請在Android Studio 3.x版,新建一個專案。增加一個Empty Activity。再拉一個ImageView、一個TextView、一個Button等元件,順序來排列出來。如下圖所示:

https://ithelp.ithome.com.tw/upload/images/20181015/20000953eOGdza3WsL.jpg

https://ithelp.ithome.com.tw/upload/images/20181015/20000953oKMgdRPl3j.jpg
在完成拉好畫面後,首先,要先加儲存到外部設備及使用照像機的權限,打開manifests目錄下的AndroidManifest.xml,加入下述網路權限,如下圖所示:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

https://ithelp.ithome.com.tw/upload/images/20181015/20000953sYj02YwStS.jpg

設定好權限後,在程式的部份,主要就是先建立好的Intent物件,呼叫手機的照像機的元件,再設定要儲存檔案的地方,最後,再成功儲存成功後,就顯示出檔案的路徑及照出來的照片。完整的程式碼如下:

public class MainActivity extends AppCompatActivity {

    public static final int CROP_PHOTO = 2;
    private ImageView showImage;

    //圖片路徑
    private Uri imageUri;

    //圖片名稱
    private String filename;
    private TextView lbl_imgpath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showImage = (ImageView) findViewById(R.id.imgpic);
        lbl_imgpath = (TextView)findViewById(R.id.lblimgpath);
    }

    public void prc_camera(View v)
    {
        //圖片名稱,用時間格式(年月日時分秒)來命名,這樣的命名,就不會重覆的情況。
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        Date date = new Date(System.currentTimeMillis());
        filename = format.format(date);

        //建立File 對象用予存儲拍照的圖片SD卡根目錄,存儲至DCIM文件夾。
        File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        File outputImage = new File(path,filename+".jpg");

        try {
            if(outputImage.exists()) {
                outputImage.delete();
            }

            outputImage.createNewFile();

        } catch(IOException e) {
            e.printStackTrace();
        }

        //將File對像轉換為Uri並啟動照相程序
        imageUri = Uri.fromFile(outputImage);

        //啟動照相功能
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        //指定圖片輸出地方。
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

        //拍完照startActivityForResult() 結果返回onActivityResult() 函數
        startActivityForResult(intent,CROP_PHOTO);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode != RESULT_OK) {
            Toast.makeText(MainActivity.this, "ActivityResult resultCode error", Toast.LENGTH_SHORT).show();
            return;
        }

        switch(requestCode) {
            case CROP_PHOTO:
                try {

                    //圖片解析成Bitmap
                    Bitmap bitmap = BitmapFactory.decodeStream(
                            getContentResolver().openInputStream(imageUri));

                    //刷新DCIM文件夾,儲存檔案至DCIM文件夾。
                    Intent intentBcc = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                    intentBcc.setData(imageUri);
                    this.sendBroadcast(intentBcc);

                    lbl_imgpath.setText(imageUri.toString());

                    //將照片顯示出來
                    showImage.setImageBitmap(bitmap);

                } catch(FileNotFoundException e) {
                    e.printStackTrace();
                }

                break;
            default:
                break;
        }
    }
}

完成好程式,因為手機的模擬器,無法模擬照像機。所以,要佈置到實體的手機上,來測試。


上一篇
在Android Studio 3.x版開發Android系統的開發記事-如何傳送資料到另外一個Activity
下一篇
在Android Studio 3.x版開發Android系統的開發記事-如何用資料庫的資料跟Spinner元件關連在一起。(上)
系列文
在Android Studio 3.x版開發Android系統的開發記事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言