在開始之前,先做好準備工作,也就是許可權問題,6.0、7.0的許可權系統可以參考我的一篇部落格:
傳送門:https://my.oschina.net/u/1462828/blog/865749
系統相機好像是5.0之後有一個大修過,7.0又有一個大修過,具體是不是這樣也不太記得了是具體哪個版本了,只是記得以前是直接呼叫相機,然後拿返回的圖片值,再然後一個版本是設定好圖片的存放路徑才開始呼叫,現在最新的版本也是這樣。原始的版本就不相容了,現在是以24作為分界線,話不多說,上程式碼:
private File sdcardTempFile = null;//用於臨時存放照片的地址
/**
* 啟動相機
*/
public void openCamera() {
int systemVersion = android.os.Build.VERSION.SDK_INT;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
sdcardTempFile = new File(<你設定的臨時目錄> + ".jpg");
Uri imageUri;
if (systemVersion < 24) {
imageUri = Uri.fromFile(sdcardTempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
} else {
//相容android7.0 使用共享檔案的形式
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, sdcardTempFile.getAbsolutePath());
imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
}
startActivityForResult(intent, CameraHelper.CAMERA_OPEN_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CameraHelper.CAMERA_OPEN_CODE && resultCode == RESULT_OK) {
blackPhoto(sdcardTempFile.getPath());//拍照完成之後,這個sdcardTempFile.getPath()就是圖片的地址
}
}
呼叫的話這麼就算呼叫成功了,我個人的話,並不是很喜歡在onActivityResult中處理圖片和接值,所以我更傾向於是新建一個Activity,然後建立一個靜態介面,啟動這個Activity的時候也將回撥介面傳過去,然後自動呼叫相機或者相簿,等選中圖片或者拍照之後,由這個Activity的onActivityResult方法中負責接收處理,然後再通過回撥介面將值傳回去。並且將照相機的許可權請求操作放到這個Activity裡面,那麼使用的時候,就比較方便了。
因為我這裡是自己寫的相簿+拍照,所以程式碼全部貼出來的話也不太合適,所以還是隻貼部分關鍵程式碼出來吧:
/**
* 回撥介面
*/
private static OnStringListener onStringListener;
/**
* 啟動本頁面
* @param activity
* @param listener 圖片回撥
*/
public static void startActivity(Activity activity, OnStringListener listener) {
onStringListener = listener;
activity.startActivity(new Intent(activity, AlbumActivity.class));
}
//呼叫步驟,1、onCreate方法 2、自動請求許可權 3、請求許可權通過之後,呼叫下面的openCamera開啟系統相機 4、通過onStringListener介面將圖片地址回撥回去
private File sdcardTempFile = null;//用於臨時存放照片的地址
/**
* 啟動相機
*/
public void openCamera() {
int systemVersion = android.os.Build.VERSION.SDK_INT;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
sdcardTempFile = new File(ConfigCache.getCacheImagePath() + ".jpg");
Uri imageUri;
if (systemVersion < 24) {
imageUri = Uri.fromFile(sdcardTempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
} else {
//相容android7.0 使用共享檔案的形式
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, sdcardTempFile.getAbsolutePath());
imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
}
startActivityForResult(intent, CameraHelper.CAMERA_OPEN_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CameraHelper.CAMERA_OPEN_CODE && resultCode == RESULT_OK) {
blackPhoto(sdcardTempFile.getPath());//拍照完成之後,這個sdcardTempFile.getPath()就是圖片的地址
}
}
/**
* 照片選好之後回撥
*
* @param path
*/
public void blackPhoto(String path) {
if (onStringListener != null) {
onStringListener.onClick(path);
}
super.finish();
}
/**
* 非選中圖片的關閉Activity操作,都是取消
*/
public void finish() {
onStringListener.onClick(null);
super.finish();
}
/**
* 回撥一個字串
* Created by 她叫我小渝 on 2016/11/1.
*/
public interface OnStringListener {
void onClick(String str);
}
最後看一下呼叫的程式碼,就很簡單了:
AlbumActivity.startActivity(getActivity(), new OnStringListener() {
@Override
public void onClick(String str) {
if(str!=null){
//選好圖片
sceneCreateActivity.onAlbumSuccess(str);
}else{
//取消選擇
}
}
});