編輯:關於Android編程
Android調用系統相冊和相機選擇圖片並顯示在imageview中,在系統調用相機拍攝中,直接返回的是經過壓縮處理後的圖像,當你直接把返還後的圖片放在imageview中時 圖片就會非常的模糊,所以要經過先存放在sd中,然後在處理並顯示。當調用系統相冊時,因為Android系統從4.4版本以後系統不再返回真實的uri路徑,而是封裝過後的uri路徑,所以當你寫代碼時必須注意,4.4是一個分水嶺,4.4以上的版本必須就通過解析和相應的處理才能獲取到真實的uri路徑。
先上程序運行的結果。
這個是調用系統相冊後的運行截圖。
調用手機相機運行的截圖就不發了 ,你自己運行一下代碼就出了,
在程序中牽扯到對sd卡的操作,所以要在文件中注冊sd卡的權限<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
首先建立xml文件:
在activity活動中我用到了PopWindow對其是相冊還是相機進行了選擇。
PopWindow的xml文件如下:
在activity中所有的代碼如下 一部分重要核心的代碼附帶有詳細的注釋:
public class MainActivity extends Activity {
private Button button;
private ImageButton imageButton_menu;
private ImageView imageView_main;
private FileInputStream is = null;
public static Context activity;
public static Uri uriImageview;
private Bitmap bitmap_guiduhua;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
activity = this.getApplicationContext();
//id綁定
idBinding();
//控件的點擊事件的設置
onClick();
}
/**
* activity布局文件中id的綁定
*/
private void idBinding() {
button = (Button) findViewById(R.id.bitton);
imageButton_menu = (ImageButton)findViewById(R.id.main_imagebutton_menu);
imageView_main = (ImageView)findViewById(R.id.main_imageview_tupian);
}
/**
* 控件的點擊事件設置
* 利用匿名類來注冊監聽事件
*/
private void onClick() {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imageView_main.setImageBitmap(bitmap_guiduhua);
}
});
imageButton_menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("menu點擊----->","menu");
MainMenuPopWindow mainMenuPopWindow = new MainMenuPopWindow(MainActivity.this);
mainMenuPopWindow.showPopupWindow(imageButton_menu);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.e("requestCode---->", ""+requestCode);
switch (requestCode){
case 1:
if (resultCode == RESULT_OK){
/**
* 判斷手機版本,因為在4.4版本都手機處理圖片返回的方法就不一樣了
* 4.4以後返回的不是真實的uti而是一個封裝過後的uri 所以要對封裝過後的uri進行解析
*/
if (Build.VERSION.SDK_INT >=19){
//4.4系統一上用該方法解析返回圖片
handleImageOnKitKat(data);
}else{
//4.4一下用該方法解析圖片的獲取
handleImageBeforeKitKat(data);
}
}
break;
case 2:
Log.e("case2---->", "22222222222222222222");
if (resultCode == RESULT_OK){
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uriImageview,"image/*");
intent.putExtra("scale",true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,uriImageview);
startActivityForResult(intent,3);//啟動裁剪程序
}
break;
case 3:
if (resultCode == RESULT_OK){
try{
Log.e("case3---->", "3333333333333");
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uriImageview));
//將裁剪後的圖片顯示出來
imageView_main.setImageBitmap(bitmap);
bitmap_guiduhua = huiDuHua(bitmap);
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
}
}
/**
* api 19以後
* 4.4版本後 調用系統相機返回的不在是真實的uri 而是經過封裝過後的uri,
* 所以要對其記性數據解析,然後在調用displayImage方法盡心顯示
* @param data
*/
private void handleImageOnKitKat(Intent data){
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(this,uri)){
//如果是document類型的uri 則通過id進行解析處理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())){
//解析出數字格式id
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" +id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
}else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())){
Uri contentUri = ContentUris.withAppendedId(Uri.parse("" +
"content://downloads/public_downloads"),Long.valueOf(docId));
imagePath = getImagePath(contentUri,null);
}
}else if ("content".equals(uri.getScheme())){
//如果不是document類型的uri,則使用普通的方式處理
imagePath = getImagePath(uri,null);
}
displayImage(imagePath);
}
/**
* 4.4版本一下 直接獲取uri進行圖片處理
* @param data
*/
private void handleImageBeforeKitKat(Intent data){
Uri uri = data.getData();
String imagePath = getImagePath(uri,null);
displayImage(imagePath);
}
/**
* 通過 uri seletion選擇來獲取圖片的真實uri
* @param uri
* @param seletion
* @return
*/
private String getImagePath(Uri uri, String seletion){
String path = null;
Cursor cursor = getContentResolver().query(uri,null,seletion,null,null);
if (cursor != null){
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
/**
* 通過imagepath來繪制immageview圖像
* @param imagPath
*/
private void displayImage(String imagPath){
if (imagPath != null){
Bitmap bitmap = BitmapFactory.decodeFile(imagPath);
imageView_main.setImageBitmap(bitmap);
bitmap_guiduhua = huiDuHua(bitmap);
}else{
Toast.makeText(this,"圖片獲取失敗",Toast.LENGTH_SHORT).show();
}
}
}
PopupWindow的作用就是從mainactivity中跳轉到相應系統的相冊或者相機界面:
public class MainMenuPopWindow extends PopupWindow{
private View popView;
private Uri uriImageview;
public MainMenuPopWindow(final Activity context){
LayoutInflater layoutInflater = (LayoutInflater)context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
popView = layoutInflater.inflate(R.layout.main_menu,null);
//獲取寬高
int h = context.getWindowManager().getDefaultDisplay().getHeight();
int w = context.getWindowManager().getDefaultDisplay().getWidth();
//設置彈出的popview視圖
this.setContentView(popView);
//設置彈出窗口的寬
this.setWidth(w/2+20);
//設置高度 為layout的自適應高度
this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
//設置 pop可點擊可見
this.setFocusable(true);
this.setOutsideTouchable(true);
this.update();
// 實例化一個ColorDrawable顏色為半透明
ColorDrawable colorDrawable = new ColorDrawable(0000000000);
// 點back鍵和其他地方使其消失,設置了這個才能觸發OnDismisslistener
this.setBackgroundDrawable(colorDrawable);
// 設置pop彈出窗體動畫效果
this.setAnimationStyle(R.style.PopWindowAnimation);
// 獲取SD卡路徑
LinearLayout linearLayout_xiangce = (LinearLayout)popView.
findViewById(R.id.linearlayout_mainmenu_xiangce);
linearLayout_xiangce.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("xiangce---->","相冊");
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
context.startActivityForResult(intent, 1);
}
});
LinearLayout linearLayout_paizhao = (LinearLayout)popView.
findViewById(R.id.linearlayout_mainmenu_paizhao);
linearLayout_paizhao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//以系統時間作為該文件 民命
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日HH-mm-ss");
Date curDate = new Date(System.currentTimeMillis());//獲取當前時間
String str = formatter.format(curDate);
Log.e("拍照---->",str);
//建立file文件用於保存來拍照後的圖片
File outputFile = new File(Environment.getExternalStorageDirectory(),str+".jpg");
/**
* 使用隱式intent進行跳轉
*/
try {
if (outputFile.exists()){
outputFile.delete();
}
outputFile.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
uriImageview = Uri.fromFile(outputFile);
//另mainactivity的uri等於本.java 文件中的 uri
MainActivity.uriImageview = uriImageview;
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,uriImageview);
//啟動相機程序
context.startActivityForResult(intent,2);
}
});
}
/**
* 設置 pop 的彈出位置
* @param parent
*/
public void showPopupWindow(View parent) {
if (!this.isShowing()) {
this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 5);
} else {
this.dismiss();
}
}
}
領導這幾天讓做一個項目,就是可以實現像支付寶首頁一樣的可以長按拖動,刪除的界面,以前沒做過,領導讓我做的時候覺得簡直是老虎吃天,無從下手啊,可是領導的任務還是要實現的,沒
在我們實際開發中,常常需要有對話框彈出跟用戶交互。AndroidOS提供有多種對話框,這一節,我們介紹一下AlertDialog和幾個常用Dialog,AlertDial
在Android開發中,我們經常會遇到流布式的布局,經常會用來一些標簽的顯示,比如qq中個人便簽,搜索框下方提示的詞語,這些是指都是流布式的布局,今天我就我們日常開放中遇
微信右上角的操作菜單看起來很好用,就照著仿了一下,不過是舊版微信的,手裡剛好有一些舊版微信的資源圖標,給大家分享一下。不知道微信是用什麼實現的,我使用popupwindo