Android 調用系統相機

package wkk.app3;

import android.app.Activity;
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.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    private static final int IMAGE = 1;
    private String path;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        path = getPath() + "/image.png";
    }


    public void onClick(View view) {
        //調用系統相機
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //指定拍照之後文件存儲路徑
        Uri uri = Uri.fromFile(new File(path));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, IMAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK && requestCode == IMAGE) {
            showImage(path);
        }
    }

    //加載圖片
    private void showImage(String imaePath) {
        Bitmap bm = BitmapFactory.decodeFile(imaePath);
        ((ImageView) findViewById(R.id.image)).setImageBitmap(bm);
    }

    public String getPath() {
        File file = new File(Environment.getExternalStorageDirectory().getPath() + "/wkk");
        if (!file.exists() || !file.isDirectory()) {
            file.mkdirs();
        }
        return file.getPath();
    }

}

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="wkk.app3.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="點擊進行拍照" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

權限

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

2016-9-5
另外在項目中集成功能的時候出現了問題,即,在調用相機的時候會將當前頁面回收掉,以至於,拍完照之後就返回上一個頁面。
即:我在A頁面調用startActivityForResult跳轉到B頁面,然後在B頁面調用相機,結果拍完照後,B頁面被finish,返回了A頁面;這並不是我想要的結果,然後在網上百度,找到了解決方法,給BActivity在manifest中設置屬性:

    android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"

然後重寫方法:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

網上說時橫豎屏的原因,說是三星手機纔有,不過那都是比較老的東西了,現在估計很多手機都會有這個東西,我的是魅藍,也有。
這樣設置之後果然有效果了,雖然偶爾還是會出現那種情況。另外這樣設置之後,在拍照完成之後activity仍舊 會被回收掉,然後執行A頁面的onActivityResult方法,然後再次創建B,所以在B頁面返回的時候,A頁面的onActivityResult方法不會在執行,所以想要返回Bitmap就沒有辦法了。因此,我取了個巧,在B頁面中設置了一個靜態數組data,和一個boolean值,然後在返回的時候,將拍照所的的bitmap轉化爲數組,賦值給data,在A頁面的onResume方法中,判斷是否拍照,然後或去到data數組,將其轉化爲bitmap,然後在將data置空,防止佔用內存。

當然如果有更好的方法,歡迎探討,畢竟靜態變量還是少用爲好。

另外我在項目中調用相機用的是:

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, 10);

在onActivityResult中接收:

            Bundle bundle1 = data.getExtras();
            // 獲取相機返回的數據,並轉換爲Bitmap圖片格式,這是縮略圖
            Bitmap bitmap = (Bitmap) bundle1.get("data");

這裏返回的圖片是縮略圖,不過我也沒想這去獲取原圖,吶,省的自己壓縮了。

發佈了71 篇原創文章 · 獲贊 80 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章