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");
這裏返回的圖片是縮略圖,不過我也沒想這去獲取原圖,吶,省的自己壓縮了。