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