android 選擇圖片以及拍照,保存圖片

在開發項目中用到這個功能,之前就按照學過的拍照和選擇照片的功能,所以也沒在意就寫了上去,可是最後發現在有些機子裏面獲取到的數據時空的,所以會導致程序崩潰的情況出現,網上找了很多例子大多都是一樣的,還是有問題,後來就查看跟蹤了拍照後返回的數據寫了下面的代碼相對大多數機子是可行的,經測試還是比較靠譜的,包括拍照後圖片翻轉了90度問題都沒問題。直接看代碼:

第一:拍照選擇界面:

Java代碼

import android.app.Activity;

import android.content.ActivityNotFoundException;

import android.content.Intent;

import android.os.Bundle;

import android.provider.MediaStore;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.Toast;

 

public class SelectPicPopupWindow extends Activity implementsOnClickListener {

 

private Button btn_take_photo, btn_pick_photo,btn_cancel;

private LinearLayout layout;

private Intent intent;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.alert_dialog);

intent = getIntent();

btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);

btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);

btn_cancel = (Button) this.findViewById(R.id.btn_cancel);

 

layout = (LinearLayout) findViewById(R.id.pop_layout);

 

// 添加選擇窗口範圍監聽可以優先獲取觸點,即不再執行onTouchEvent()函數,點擊其他地方時執行onTouchEvent()函數銷燬Activity

layout.setOnClickListener(new OnClickListener() {

 

public void onClick(View v) {

// TODO Auto-generated method stub

Toast.makeText(getApplicationContext(), "提示:點擊窗口外部關閉窗口!",

Toast.LENGTH_SHORT).show();

}

});

// 添加按鈕監聽

btn_cancel.setOnClickListener(this);

btn_pick_photo.setOnClickListener(this);

btn_take_photo.setOnClickListener(this);

}

 

// 實現onTouchEvent觸屏函數但點擊屏幕時銷燬本Activity

@Override

public boolean onTouchEvent(MotionEvent event) {

finish();

return true;

}

 

@Override

protected void onActivityResult(int requestCode, intresultCode, Intent data) {

if (resultCode != RESULT_OK) {

return;

}

//選擇完或者拍完照後會在這裏處理,然後我們繼續使用setResult返回Intent以便可以傳遞數據和調用

if (data.getExtras() != null)

intent.putExtras(data.getExtras());

if (data.getData()!= null)

intent.setData(data.getData());

setResult(1, intent);

finish();

 

}

 

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_take_photo:

try {

//拍照我們用ActionMediaStore.ACTION_IMAGE_CAPTURE

//有些人使用其他的Action但我發現在有些機子中會出問題,所以優先選擇這個

Intent intent = newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, 1);

} catch (Exception e) {

e.printStackTrace();

}

break;

case R.id.btn_pick_photo:

try {

//選擇照片的時候也一樣,我們用ActionIntent.ACTION_GET_CONTENT

//有些人使用其他的Action但我發現在有些機子中會出問題,所以優先選擇這個

Intent intent = new Intent();

intent.setType("image/*");

intent.setAction(Intent.ACTION_GET_CONTENT);

startActivityForResult(intent, 2);

} catch (ActivityNotFoundException e) {

 

}

break;

case R.id.btn_cancel:

finish();

break;

default:

break;

}

 

}

 

}

第二:顯示照片界面:

Java代碼

import android.app.Activity;

import android.content.Intent;

import android.graphics.Bitmap;

import android.net.Uri;

import android.os.Bundle;

import android.provider.MediaStore;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageView;

 

public class MainActivity extends Activity {

private ImageView photo;

 

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

photo = (ImageView) this.findViewById(R.id.text);

// 把文字控件添加監聽,點擊彈出自定義窗口

photo.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//使用startActivityForResult啓動SelectPicPopupWindow當返回到此Activity的時候就會調用onActivityResult函數

startActivityForResult(new Intent(MainActivity.this,

SelectPicPopupWindow.class), 1);

}

});

}

 

@Override

protected void onActivityResult(int requestCode, intresultCode, Intent data) {

 

switch (resultCode) {

case 1:

if (data != null) {

//取得返回的Uri,基本上選擇照片的時候返回的是以Uri形式,但是在拍照中有得機子呢Uri是空的,所以要特別注意

Uri mImageCaptureUri = data.getData();

//返回的Uri不爲空時,那麼圖片信息數據都會在Uri中獲得。如果爲空,那麼我們就進行下面的方式獲取

if (mImageCaptureUri != null) {

Bitmap image;

try {

//這個方法是根據Uri獲取Bitmap圖片的靜態方法

image = MediaStore.Images.Media.getBitmap(this.getContentResolver(),mImageCaptureUri);

if (image != null) {

photo.setImageBitmap(image);

}

} catch (Exception e) {

e.printStackTrace();

}

} else {

Bundle extras = data.getExtras();

if (extras != null) {

//這裏是有些拍照後的圖片是直接存放到Bundle中的所以我們可以從這裏面獲取Bitmap圖片

Bitmap image = extras.getParcelable("data");

if (image != null) {

photo.setImageBitmap(image);

}

}

}

 

}

break;

default:

break;

 

}

}

 

}

第三:如果需要保存圖片到SD卡或者上傳圖片可以用下面代碼:

Java代碼

public static String savePicToSdcard(Bitmap bitmap,String path,

String fileName) {

String filePath = "";

if (bitmap == null) {

return filePath;

} else {

 

filePath=path+ fileName;

File destFile = new File(filePath);

OutputStream os = null;

try {

os = new FileOutputStream(destFile);

bitmap.compress(CompressFormat.JPEG, 100, os);

os.flush();

os.close();

} catch (IOException e) {

filePath = "";

}

}

return filePath;

}

上傳圖片的話我們可以獲取bitmap的流然後上傳,如上面方式獲取,如要上傳,上傳代碼自己實現,這個比較簡單。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章