1. 程式人生 > >android選擇圖片得到實際路徑的總結

android選擇圖片得到實際路徑的總結

專案中有個需求,通過拍照或者選取系統圖片後,顯示到控制元件上,並且要得到圖片的實際路徑。

自己用的是華為手機,4.0系統。發現選取圖片,有2個不同的選項,分別是“相簿”和“檔案管理”,如下圖所示


1、通過系統拍照,得到的uri地址是

 file:///mnt/sdcard/DCIM/camera/faceImage.JPEG

2、通過檔案管理器,得到的uri地址是
file:///mnt/sdcard/20140724181622520977.jpg

3、通過相簿,得到的圖片uri地址是
 content://media/external/images/media/888737

我們發現,得到圖片的地址有2種類型,以file開頭和content開頭的,但是以content開頭的,沒有路徑,只有圖片編號的uri.這就導致接下來無法根據圖片實際路徑,

所以需要要一個方法,把content的變成實際真實檔案路徑,加上一個方法如下即可

private String getRealPathFromURI(Uri contentUri) { //傳入圖片uri地址
	    String[] proj = { MediaStore.Images.Media.DATA };
	    CursorLoader loader = new CursorLoader(getActivity(), contentUri, proj, null, null, null);
	    Cursor cursor = loader.loadInBackground();
	    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
	    cursor.moveToFirst();
	    return cursor.getString(column_index);
	}
前後的結果如下,可以看到我們通過這個方法得到了圖片的真實路徑



總結,在獲取圖片路徑時候,要先判斷uri字串是否包含 content ,如果有的話,就要轉換。如果以file開頭的,就不管它

	       String textPre=uri.toString();//得到圖片uri地址字串
		//圖片檔案的路徑 ,有2種格式
		//華為手機從相簿選擇的結果 ,以content開頭
		//content://media/external/images/media/888737
		
		//華為手機從檔案選擇器的結果,或者系統拍照也是如下的結果,以file開頭
              //  file:///mnt/sdcard2/%E7%A8%8B%E5%BA%8F%E5%91%98%E6%97%A5%E5%B8%B8.jpg

		System.out.println("轉換前的地址是 :   "+textPre);
		
		if(uri.toString().contains("content://")){ //如果包含有content開頭,需要轉化為其實際路徑,不能用content開頭
			 text=getRealPathFromURI(uri);
		}else{
			text=textPre;       //如果用file開頭,不用轉化
		}
		
		System.out.println("轉換後的地址是 :   "+text);
		headPicName=text.substring(text.lastIndexOf("/")+1);//儲存圖片的檔名,注意索引加1
		System.out.println("選取圖片的地址是:  "+headPicName);

最後附上自己一個原始碼,是上一篇的更新
package com.qinghui.sslq.fragment;

import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.qinghui.sslq.R;
import com.qinghui.sslq.activity.LoginActivity;
import com.qinghui.sslq.activity.ShowContentActivity;
import com.qinghui.sslq.entity.Detail;
import com.qinghui.sslq.util.CommonUtil;
import com.qinghui.sslq.util.NetWebServiceUtil;
import com.qinghui.sslq.util.PromptUtil;
import com.qinghui.sslq.util.ScreenManager;
import com.qinghui.sslq.util.NetWebServiceUtil.WebServiceCallBack;
import com.qinghui.sslq.util.XmlPullManager;
import com.qinghui.sslq.view.SelectPicPopupWindow;

import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.content.CursorLoader;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;


public class PersonListFragment extends BaseFragment implements OnClickListener {
 
	 private View view;     
	 private Bundle bundle;
	 
	 private String headPicName;
	 
	 @ViewInject(R.id.leftIcon)
	 private TextView leftIcon; // 標題欄右面的文字
	 @ViewInject(R.id.titleText)
	 private TextView titleText;// 標題欄中心的文字
	 
	 @ViewInject(R.id.userName)
	 private TextView userName; //使用者名稱
	 
	 @ViewInject(R.id.gender)
	 private TextView gender; //性別
	 
	 @ViewInject(R.id.phoneNumber)   //電話
	 private TextView phoneNumber;
	 
	 @ViewInject(R.id.change_userheadimg)     //修改頭像
	 private RelativeLayout change_userheadimg;
	 
	 @ViewInject(R.id.useHelp)
	 private RelativeLayout useHelp; //使用幫助
	 @ViewInject(R.id.changeGender)
	 private RelativeLayout changeGender; //修改性別
	 
	 @ViewInject(R.id.change_userPassword) //修改密碼
	 private RelativeLayout change_userPassword;
	 
	 @ViewInject(R.id.messageNotify) //訊息提醒
	 private RelativeLayout messageNotify;
	 
	 @ViewInject(R.id.changeUserName) //訊息提醒
	 private RelativeLayout changeUserName;
	 
	 @ViewInject(R.id.updateVersion) //版本更新
	 private RelativeLayout updateVersion;
	 
	 @ViewInject(R.id.loginCurrent) //退出登入
	 private RelativeLayout loginCurrent;
	 
	 @ViewInject(R.id.modifyPhoneNum)
	 private RelativeLayout modifyPhoneNum; //修改繫結手機
	 
	 private PopupWindow popupWindow;
	 private Detail detail;
	protected String genderId;
	private static final String IMAGE_FILE_NAME = "faceImage.JPEG"; 
	
	private static final int CAMERA_REQUEST_CODE = 2;
	private static final int IMAGE_REQUEST_CODE = 1;
	private static final int RESULT_REQUEST_CODE = 3;
	
	private Bitmap photo;// 暫存圖片
	
	@ViewInject(R.id.userimg)
	private ImageView userimg; // 頭像
	private File f;
	
	
	protected View createView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		
	    view=View.inflate(getActivity(), R.layout.fragment_personlist, null);
	    ViewUtils.inject(this, view);
	    initViews();//初始化控制元件,設定自己的內容資訊 
	    initData();
		return view;   
	}





	private void initViews() {
		leftIcon.setVisibility(View.INVISIBLE);
		titleText.setText("個人中心");    
		bundle=getArguments();
		detail=(Detail) bundle.getSerializable("detailObjcet");
		System.out.println("第2次列印實體"+detail);
		
		if(detail!=null){
			userName.setText(detail.getLogin().getAccount_name());//設定名字
			if(detail.getLogin().getAccount_sex()==1){ //設定性別
				gender.setText("男");
			}else{
				gender.setText("女");
			}
			phoneNumber.setText(detail.getLogin().getAccount_mobile());//設定電話
		}
		
		 f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +"head_pic.jpg");   
			
		 if(f.exists()){
			 userimg.setImageURI(Uri.fromFile(f));
		 }else{
			 userimg.setImageResource(R.drawable.ic_launcher);
		 }
		
		
	}

	private void initData() {
		change_userheadimg.setOnClickListener(this);
		//useHelp.setOnClickListener(this);
		change_userPassword.setOnClickListener(this);
		changeUserName.setOnClickListener(this);
		//messageNotify.setOnClickListener(this);
	  //updateVersion.setOnClickListener(this);
		loginCurrent.setOnClickListener(this);
		changeGender.setOnClickListener(this);
		//modifyPhoneNum.setOnClickListener(this);
	}
	
	
	@Override
	public void onClick(View view) {

          int id =view.getId();
          switch (id ) {
		case R.id.change_userheadimg:
			//切換頭像的彈出視窗
			popupWindow=new SelectPicPopupWindow(getActivity(), itemsOnClick);
			popupWindow.showAtLocation(getActivity().findViewById(android.R.id.tabs),
						Gravity.BOTTOM, 0, 0);
			
			break;

		case R.id.changeGender:
			//修改性別
			
			  final String[] genders=getResources().getStringArray(R.array.gender);
			   new AlertDialog.Builder(getActivity())
			   .setTitle("修改您的性別")
			   .setItems(R.array.gender, new DialogInterface.OnClickListener() {
				/**當點選對話方塊的列表項時,回撥該方法
				 * dialog:AlertDialog
				 * which:你點了哪一個列表項
				 */
				@Override
				public void onClick(DialogInterface dialog, int which) {
					gender.setText(genders[which]);
				    genderId=changeGenderToId(genders[which]);
				     //	傳送網路請求修改性別
					
				    Map<String, Object> map = new HashMap<String, Object>();
				   	map.put("ACCOUNT_CODE",detail.getLogin().getAccount_code());
					map.put("ACCOUNT_NAME",userName.getText().toString().trim());
					map.put("ACCOUNT_SEX", genderId);
				    
				    
				    final Dialog pDialog=  PromptUtil.showProgressDialog(getActivity());  
				    try {
						NetWebServiceUtil.doSoapRequest("/service/PersonalCenterWebservice","modifyPersonal","MODIFY", map, new WebServiceCallBack() {
							
							@Override
							public void callBack(String result) {
								PromptUtil.closeProgressDialog(pDialog);
								if(result!=null){
									
								   if(XmlPullManager.parseOneXml(result).getResult()==1){
									   PromptUtil.toast(getActivity(),"修改成功");
								   }else if(XmlPullManager.parseOneXml(result).getResult()==2){
									   PromptUtil.toast(getActivity(),"使用者名稱不存在");
									   
								   }else{
									   PromptUtil.toast(getActivity(),"修改失敗");
								   }
								
								}else{
									PromptUtil.toast(getActivity(),"服務端資料錯誤");
								}
							}
						});
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

				private String changeGenderToId(String string) {
					// TODO Auto-generated method stub
					 if(string.equals("男")){
			        	  return "1"; 
			          }else{
			        	  return "2";
			          }
				}
			})
			   .create()
			   .show();
			
			
			break;
		case R.id.useHelp:
			//使用幫助
			break;
			
		case R.id.changeUserName:
			//修改使用者名稱
			
			//使用自定義的對話方塊
			final Dialog dialog=new Dialog(getActivity(),R.style.MyDialogTheme);//建立對話方塊物件
			//設定內容檢視,重新佈局一個新的
			dialog.setContentView(R.layout.diy_change_name_dialog);
			//通過父控制元件獲取自定義對話方塊的確定按鈕控制元件
			Button button=(Button) dialog.findViewById(R.id.confirm);
			//對按鈕設定點選監聽事件
			button.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					//輸出使用者輸入的型別資訊
					EditText edit =(EditText) dialog.findViewById(R.id.newAcountName);
					
					String name_txt=edit.getText().toString().trim();
					userName.setText(name_txt);
					String genderID = changeGenderToId(gender.getText().toString());
					
                //	傳送網路請求修改性別
					
				    Map<String, Object> map = new HashMap<String, Object>();
				   	map.put("ACCOUNT_CODE",detail.getLogin().getAccount_code());
					map.put("ACCOUNT_NAME",name_txt);
					map.put("ACCOUNT_SEX", genderID);
				    
				    
				    final Dialog pDialog=  PromptUtil.showProgressDialog(getActivity());  
						try {
							NetWebServiceUtil.doSoapRequest("/service/PersonalCenterWebservice","modifyPersonal","MODIFY", map, new WebServiceCallBack() {
								
								@Override
								public void callBack(String result) {
								
									PromptUtil.closeProgressDialog(pDialog);
									if(result!=null){
										
									   if(XmlPullManager.parseOneXml(result).getResult()==1){
										   PromptUtil.toast(getActivity(),"修改成功");
									   }else if(XmlPullManager.parseOneXml(result).getResult()==2){
										   PromptUtil.toast(getActivity(),"使用者名稱不存在");
										   
									   }else{
										   PromptUtil.toast(getActivity(),"修改失敗");
									   }
									
									}else{
										PromptUtil.toast(getActivity(),"服務端資料錯誤");
									}
									
								}
							});
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					
					dialog.dismiss();//消失,解僱
				}

				private String changeGenderToId(String string) {
					// TODO Auto-generated method stub
					 if(string.equals("男")){
			        	  return "1"; 
			          }else{
			        	  return "2";
			          }
				}
			});
			dialog.show();//顯示對話方塊 ,當點選Dialog物件,預設不會消失
			
			
			break;
			
			
		case R.id.modifyPhoneNum:
			//修改繫結手機
			System.out.println("修改繫結手機");
			
			
			break;
			
		case R.id.change_userPassword:
			//修改密碼
			Intent intent=new Intent(getActivity(), ShowContentActivity.class);
			bundle.putString("start_tag", "change_password");
			intent.putExtras(bundle);
			startActivity(intent);
			break;
			
		case R.id.updateVersion:
			//版本更新
			break;
			
		case R.id.loginCurrent:
			//退出登入
			PromptUtil.ExitSystem(getActivity());
            //	Intent intent=new Intent(getActivity(), LoginActivity.class);
			//	startActivity(intent);
			break;
			
		default:
			break;
		}
		
	}
	//這裡面的是popupWindow裡面的點選事件
  	private OnClickListener itemsOnClick = new OnClickListener() {
  		public void onClick(View v) {
  			//銷燬popup視窗
  			popupWindow.dismiss();
  			
  			switch (v.getId()) {
  			
  				case R.id.btn_pick_photo: 	 
  				//	Toast.makeText(getActivity(), "這個是選擇圖片", 1).show();
  					
  					Intent intentFromGallery = new Intent(Intent.ACTION_GET_CONTENT);
  					intentFromGallery.addCategory(Intent.CATEGORY_OPENABLE);
  					intentFromGallery.setType("image/**"); // 設定檔案型別
 					startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE);
  					break;
  					
  				case R.id.btn_take_photo:		
  				//	Toast.makeText(getActivity(), "這個是拍圖片", 1).show();
  					Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  					try {
  						File file = new File(Environment.getExternalStorageDirectory()
  								+ "/DCIM/camera/", IMAGE_FILE_NAME);
  						Uri imageUri = Uri.fromFile(file);//拍照時,將拍得的照片先儲存在本地
  						intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//然後到時照片就會儲存到你指定的那個路徑的IMAGE_FILE_NAME檔案了.
  						startActivityForResult(intentFromCapture, CAMERA_REQUEST_CODE);
  					} catch (Exception e) {
  						e.printStackTrace();
  					}
  					break;
  			}
  		}
  	};
  	
  	public void onActivityResult(int requestCode, int resultCode, Intent data) {
  		if (resultCode != 0) {
			switch (requestCode) {

			// 這個是選擇圖片的請求碼
			case IMAGE_REQUEST_CODE:
				startPhotoZoom(data.getData());
				break;

			// 這個是拍照的請求碼
			case CAMERA_REQUEST_CODE:
				// 先檢視是否有外儲存卡
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED)) {

					File tempFile = new File(
							Environment.getExternalStorageDirectory()
									+ "/DCIM/camera/" + IMAGE_FILE_NAME);
					startPhotoZoom(Uri.fromFile(tempFile));//拍照時,將拍得的照片先儲存在本地
				} else {
					Toast.makeText(getActivity(), "未找到儲存卡,無法儲存照片!",
							Toast.LENGTH_LONG).show();
				}
				break;

			case RESULT_REQUEST_CODE:
				if (data != null) {
					getImageToView(data);
				}
				break;
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
  	}


	private void getImageToView(Intent data) {
            Bundle extras = data.getExtras();
		
		if (null != extras) {
			photo = extras.getParcelable("data");
			userimg.setImageBitmap(photo);//給控制元件新增選擇後的圖片,而且這個圖片是壓縮過的??這裡有疑問
			
			FileOutputStream out=null;
			
			//這裡以後儲存了圖片後,要儲存到外存中
			if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
		   try {
			   //這個是自己儲存一份到外存,方便下次讀取影象圖片
		    f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +"head_pic.jpg");   
		    if (!f.exists()) {
				f.createNewFile();
			}
			out=new FileOutputStream(f);
			photo.compress(CompressFormat.JPEG, 80, out);
		     
			//還要把圖片上傳到服務端去儲存,保持系統的一致性
			uploadToWeb(photo);
			
	   	//	photo.recycle(); //加上這句圖片會變黑??待解決
			
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		}
	}

	/**上傳頭像圖片到服務端
	 * @param bitmap
	 * @author hemiy
	 */
	private void uploadToWeb(Bitmap bitmap) {
		   Map<String, Object> map = new HashMap<String, Object>();
		   	map.put("ACCOUNT_CODE",detail.getLogin().getAccount_code());
			map.put("FILENAME",headPicName);
			map.put("CONTENT", CommonUtil.encodeBitmapToBase64Str(bitmap));
		    
		    final Dialog pDialog=  PromptUtil.showProgressDialog(getActivity());  
		 
				try {
					NetWebServiceUtil.doSoapRequest("/service/PersonalCenterWebservice","uploadHeadPic","INPUT", map, new WebServiceCallBack() {
						
						@Override
						public void callBack(String result) {
						 PromptUtil.closeProgressDialog(pDialog);
						 if(result!=null){
						
						 Detail detailResult=XmlPullManager.parseOneXml(result);
						     check(detailResult.getResult());//檢查回傳結果
						 
						 }else{
							 PromptUtil.toast(getActivity(), "服務端傳輸錯誤");
						 }
							
						}

						private void check(int result) {
						      switch (result) {
							case 0:
								 PromptUtil.toast(getActivity(), "頭像上傳失敗");
								break;
							case 1:
								PromptUtil.toast(getActivity(), "頭像上傳成功");
								break;
							case 2:
								PromptUtil.toast(getActivity(), "上傳引數錯誤");
								break;

							default:
								break;
							}
							
						}
					});
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		    
	}

	

	private void startPhotoZoom(Uri uri) {
		String text=null;
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		intent.putExtra("crop", "true");
		// aspectX aspectY 是寬高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		intent.putExtra("outputX", 320);
		intent.putExtra("outputY", 320);
		intent.putExtra("scale", true);
		intent.putExtra("return-data", true);
	  
		String textPre=uri.toString();
		//圖片檔案的路徑 ,有2種格式
		//華為手機從相簿選擇的結果 ,以content開頭
		//content://media/external/images/media/888737
		
		//華為手機從檔案選擇器的結果,系統拍照也是如下的結果,以file開頭
        //  file:///mnt/sdcard2/%E7%A8%8B%E5%BA%8F%E5%91%98%E6%97%A5%E5%B8%B8.jpg

		System.out.println("轉換前的地址是 :   "+textPre);
		
		if(uri.toString().contains("content://")){ //如果包含有content開頭,需要轉化為其實際路徑,不能用content開頭
			 text=getRealPathFromURI(uri);
		}else{
			text=textPre;       //如果用file開頭,不用轉化
		}
		
		System.out.println("轉換後的地址是 :   "+text);
		headPicName=text.substring(text.lastIndexOf("/")+1);//儲存圖片的檔名,注意索引加1
		System.out.println("選取圖片的地址是:  "+headPicName);
		startActivityForResult(intent, RESULT_REQUEST_CODE);
		
	};
  	
	/**
	 * http://ask.csdn.net/questions/293 參考網頁
	 * 把content開頭的檔案,得到其實際路徑
	 * @param contentUri
	 * @return
	 * @author hemiy
	 */
	private String getRealPathFromURI(Uri contentUri) {
	    String[] proj = { MediaStore.Images.Media.DATA };
	    CursorLoader loader = new CursorLoader(getActivity(), contentUri, proj, null, null, null);
	    Cursor cursor = loader.loadInBackground();
	    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
	    cursor.moveToFirst();
	    return cursor.getString(column_index);
	}
}

參考文章

相關推薦

android選擇圖片得到實際路徑總結

專案中有個需求,通過拍照或者選取系統圖片後,顯示到控制元件上,並且要得到圖片的實際路徑。 自己用的是華為手機,4.0系統。發現選取圖片,有2個不同的選項,分別是“相簿”和“檔案管理”,如下圖所示 1、通過系統拍照,得到的uri地址是 file:///mnt/sdc

android選擇圖片,通過uri獲取路徑

roi con sch project else mov providers tex exc /** * 根據Uri獲取圖片的絕對路徑 * * @param context 上下文對象 * @param uri 圖片

Android圖片快取的一些總結

最近在做圖片載入時遇到記憶體溢位問題,所以這裡找到一些資料學習後,在這裡做一個總結。 這裡使用帶了LruCache技術和DiskLruCache技術,簡單地說,LruCache是做的記憶體快取處理,只負責記憶體中圖片的管理,也就是在記憶體中快取被清除後還是需要

android選擇圖片或拍照圖片上傳到伺服器(包括上傳引數)

 最近要搞一個專案,需要上傳相簿和拍照的圖片,不負所望,終於完成了!  不過需要說明一下,其實網上很多教程拍照的圖片,都是縮圖不是很清晰,所以需要在呼叫照相機的時候,事先生成一個地址,用於標識拍照的圖片URI 具體上傳程式碼: 1.選擇圖片和上傳介面,包括上傳完成和異常的回撥監聽

Uri android 選擇圖片或拍照時旋轉了90度問題

由於前面的博文中忽略了點內容,所以在這裡補上,下面內容就是解決拍照或者選擇圖片顯示的時候圖片旋轉了90度或者其他度數問題,以便照片可以正面顯示:具體如下: 首先直接看上面博文下的拍完照或者選完圖後處理部分: Java程式碼   @Override      

Android 通過相簿選擇圖片提示找不到路徑 open failed: EROFS (Read-only file system)

app中使用者資訊上傳頭像這個挺常見的,一般的都是拍照或選擇圖片上傳。這樣一般會出現三個常見問題。 1.進入照相機或相簿後,如果沒有進行任何操作直接back鍵返回,有可能造成程式崩潰。 其中一種解決辦法就是判斷onActivityResult方法裡的resultCode,經

Android上傳圖片之調用系統拍照和從相冊選擇圖片

item 取圖 空指針 ctu setimage tro edate eas tostring Android上傳圖片之調用系統拍照和從相冊選擇圖片 本篇文章已授權

android 4 0 以上平臺選擇圖片報錯Attempted to access a cursor after it

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示

我的配置是: android手機版本是7.0 android studio是3.1 android平臺是9.0 我的測試都是在真機上進行的。 首先來看程式碼: package com.example.sunshunli.cameraalbumtest; import a

Android啟動系統相機,開啟相簿選擇圖片

相機 Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //指定拍照後圖片名稱 String photoName = System.currentTimeMillis() + ".jpg"; //設定拍照後圖片存放位置RO

Android拍照和相簿選擇圖片上傳所遇到的一些坑

微信公眾號:IT小頑童 前段時間做拍照和相簿選擇圖片上傳,遇到一些坑,最近閒來沒事,就整理一篇部落格,並寫了個demo,專案中使用純java,這次採用java + kotlin混合,GitHub的地址戳此 1、首先遇到的的是Android7.0的坑 說是坑,有點欲加

呼叫android系統相機拍照並將圖片傳指定路徑並獲取相片

public void onClick(View v) { if (v.getId() == R.id.btn_take) { // 調系統相機 if (Environment.getExterna

Android 實現拍照,選擇圖片並剪下儲存

專案中有一個實現圖片的剪下功能和APP“酷站”的點選中間“+”字元,進行圖片選擇到最後剪下功能;“微信”選擇圖片並剪下類似 ,由於測試的模擬器中沒有圖片,所以把參考資料上圖片截下來展示下: 查了一些參考資料,使用的而並不是Android系統的圖片剪下方法,而是UCrop庫

android 拍照本本地選擇圖片上傳

好久沒有坐下來安安靜靜的寫部落格了 ,上一篇寫的是自定義相機 ,以前專案中用過一些第三方的庫 ,萬物歸終今天找個時間總結一下 ,做開發幾年了 。隨著android studio的運用,開源資源越來越多,越來越好用 ,但是使用第三方的開原始碼,越來越不爽 ,很多庫漸漸的丟下了

android從相簿選擇圖片和拍照選擇圖片

在android開發中選擇圖片的方式大致可以分類兩種,一種是從手機相簿獲取,另外一種則是通過呼叫手機拍照獲得 手機相簿中獲取,這種方式需要讀取儲存卡的許可權 <uses-permission android:name="android.permission.REA

Android裁剪圖片總結

在網上搜索了Android裁剪圖片的方式,發現有兩種: 1、裁剪後返回的不是Intent中指定尺寸的圖,而是縮圖 2、裁剪後返回的是指定大小的圖片 關於這兩種裁剪方式,我把自己試驗後的結果記錄如下: 1、裁剪成縮圖模式,步驟如下: (1)先通過Intent選擇圖片,獲取圖片

Android開發之呼叫相機拍照與本地相簿選擇圖片

使用者看到的介面如下,也是我的xml介面: demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖: 點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖: 這時候你可以直接點選確定,也可

android 從matrix獲取處理過的圖片實際寬度

很顯然的,這麼做費力不討好。效率不高。。。。。開始我以為這個坑爹的matrix的作者比較腦殘。既然沒有做出直接能拿當前圖片座標的方法。那應該也沒有想過會記錄圖片的變化吧。。可是後來我發現我錯了。。。。寫這段程式的人就是個學數學的購幣。。。。。。

[總結]Android 獲取本地視訊檔案路徑並播放的幾種方式

Android 獲取本地視訊檔案路徑的方式 在android 專案開發過程中,遇到獲取本地視訊檔案的問題,記錄一下獲取本地檔案的幾種方式。 首先說下sdcard在手機中的掛載位置。 android手

Android中相機拍攝照片,以及相簿選擇圖片壓縮上傳(壓縮後儲存進SD中)(可用於修改頭像等)

           這個功能借鑑了多個大神的,然後整合起來。                    Android中相機拍攝照片,以及相簿選擇圖片壓縮上傳(壓縮後儲存進SD中)(可用   於修改頭像等)                       第一步: privat