android選擇相冊
❶ Android studio從相冊裡面選圖片無法選中
該功能主要實現上傳圖片到伺服器,選擇圖片的方式有兩種,一種是從手機相冊中選擇,另一種是調用手機攝像頭拍照。
1.從相冊選擇的圖片會存儲到 data 裡面,而相機拍照的圖片不會存儲到 data 裡面。
2.由於從相冊選擇的圖片會存儲到 data 裡面,而相機拍照的圖片不會存儲到 data 裡面,所以在獲取圖片資源進行回顯的方式不同,請看一下詳細代碼:(一定要創建文件 createFileName())。
❷ android調用手機拍照以及從相冊選擇照片需要判斷版本號嗎
舉個實際例子看看吧。
/*用來標識請求照相功能的activity*/
private static final int CAMERA_WITH_DATA = 3023;
/*用來標識請求gallery的activity*/
private static final int PHOTO_PICKED_WITH_DATA = 3021;
/*拍照的照片存儲位置*/
private static final File PHOTO_DIR = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera");
private File mCurrentPhotoFile;//照相機拍照得到的圖片
[java] view
plain
private void doPickPhotoAction() {
Context context = EditContact.this;
// Wrap our context to inflate list items using correct theme
final Context dialogContext = new ContextThemeWrapper(context,
android.R.style.Theme_Light);
String cancel="返回";
String[] choices;
choices = new String[2];
choices[0] = getString(R.string.take_photo); //拍照
choices[1] = getString(R.string.pick_photo); //從相冊中選擇
final ListAdapter adapter = new ArrayAdapter<String>(dialogContext,
android.R.layout.simple_list_item_1, choices);
final AlertDialog.Builder builder = new AlertDialog.Builder(
dialogContext);
builder.setTitle(R.string.attachToContact);
builder.setSingleChoiceItems(adapter, -1,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
switch (which) {
case 0:{
String status=Environment.getExternalStorageState();
if(status.equals(Environment.MEDIA_MOUNTED)){//判斷是否有SD卡
doTakePhoto();// 用戶點擊了從照相機獲取
}
else{
showToast("沒有SD卡");
}
break;
}
case 1:
doPickPhotoFromGallery();// 從相冊中去獲取
break;
}
}
});
builder.setNegativeButton(cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
}
/**
* 拍照獲取圖片
*
*/
protected void doTakePhoto() {
try {
// Launch camera to take photo for selected contact
PHOTO_DIR.mkdirs();// 創建照片的存儲目錄
mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());// 給新照的照片文件命名
final Intent intent = getTakePickIntent(mCurrentPhotoFile);
startActivityForResult(intent, CAMERA_WITH_DATA);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.photoPickerNotFoundText,
Toast.LENGTH_LONG).show();
}
}
public static Intent getTakePickIntent(File f) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
return intent;
}
/**
* 用當前時間給取得的圖片命名
*
*/
private String getPhotoFileName() {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat(
"'IMG'_yyyy-MM-dd HH:mm:ss");
return dateFormat.format(date) + ".jpg";
}
// 請求Gallery程序
protected void doPickPhotoFromGallery() {
try {
// Launch picker to choose photo for selected contact
final Intent intent = getPhotoPickIntent();
startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.photoPickerNotFoundText1,
Toast.LENGTH_LONG).show();
}
}
// 封裝請求Gallery的intent
public static Intent getPhotoPickIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 80);
intent.putExtra("outputY", 80);
intent.putExtra("return-data", true);
return intent;
}
// 因為調用了Camera和Gally所以要判斷他們各自的返回情況,他們啟動時是這樣的startActivityForResult
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK)
return;
switch (requestCode) {
case PHOTO_PICKED_WITH_DATA: {// 調用Gallery返回的
final Bitmap photo = data.getParcelableExtra("data");
// 下面就是顯示照片了
System.out.println(photo);
//緩存用戶選擇的圖片
img = getBitmapByte(photo);
mEditor.setPhotoBitmap(photo);
System.out.println("set new photo");
break;
}
case CAMERA_WITH_DATA: {// 照相機程序返回的,再次調用圖片剪輯程序去修剪圖片
doCropPhoto(mCurrentPhotoFile);
break;
}
}
}
protected void doCropPhoto(File f) {
try {
// 啟動gallery去剪輯這個照片
final Intent intent = getCropImageIntent(Uri.fromFile(f));
startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
} catch (Exception e) {
Toast.makeText(this, R.string.photoPickerNotFoundText,
Toast.LENGTH_LONG).show();
}
}
/**
* Constructs an intent for image cropping. 調用圖片剪輯程序
*/
public static Intent getCropImageIntent(Uri photoUri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(photoUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 80);
intent.putExtra("outputY", 80);
intent.putExtra("return-data", true);
return intent;
}
❸ 如何調用android的拍照或本地相冊選取,然後再實現相片上傳伺服器
首先是拍照:使用Intent即可,
[java] view plainprint?
01.final String start = Environment.getExternalStorageState();
02.private static final String PHOTOPATH = "/photo/";
03.
04.if(start.equals(Environment.MEDIA_MOUNTED)){
05.Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
06.File file = new File(Environment.getExternalStorageDirectory()+PHOTOPATH);
07.if(!file.exists()){
08.file.mkdirs();
09.}
10.tempphontname = System.currentTimeMillis()+".jpg";
11.buffer.append(Environment.getExternalStorageDirectory()+PHOTOPATH).append(tempphontname);
12.intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(buffer.toString())));
13.startActivityForResult(intent, 1);
14.}
final String start = Environment.getExternalStorageState();
private static final String PHOTOPATH = "/photo/";
if(start.equals(Environment.MEDIA_MOUNTED)){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory()+PHOTOPATH);
if(!file.exists()){
file.mkdirs();
}
tempphontname = System.currentTimeMillis()+".jpg";
buffer.append(Environment.getExternalStorageDirectory()+PHOTOPATH).append(tempphontname);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(buffer.toString())));
startActivityForResult(intent, 1);
}
其次是從本地相冊選:依舊是Intent.
如下代碼:
[java] view plainprint?
01.if(start.equals(Environment.MEDIA_MOUNTED)){
02. Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
03. getImage.addCategory(Intent.CATEGORY_OPENABLE);
04. getImage.setType("image/jpeg");
05. startActivityForResult(getImage, 0);
06.}
if(start.equals(Environment.MEDIA_MOUNTED)){
Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
getImage.addCategory(Intent.CATEGORY_OPENABLE);
getImage.setType("image/jpeg");
startActivityForResult(getImage, 0);
}
接下來是主要的:因為調用完系統的方法後,回返回到回調方法onActivityResult(int, int, Intent)中,
在裡面進行主要的照片上傳伺服器的操作,
見代碼:
[java] view plainprint?
01.@Override
02. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
03. ContentResolver resolver = getContentResolver();
04. if(requestCode==1)//
05. {
06. if(resultCode==Activity.RESULT_OK)
07. {
08. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
09. {
10.ew Thread(new Runnable()
11. {
12. @Override
13. public void run() {
14.//進行上傳操作
15.}
16.}.start();
轉載
❹ Android拍照和選擇相冊圖片上傳為什麼不清晰
壓縮演算法的問題,不知道是你自己寫還是用其他產商的apk,
壓縮過頭了,導致清晰度下降了。
還有就是有些手機拍完照,本身有一定的壓縮處理,所以再進行壓縮就更小了,更模糊了。
這個就是手機要做適配處理。
❺ Android10以上拍照和選擇相冊適配以及向下兼容適配
最近一直被Android10相關的適配搞得焦頭爛額,之前也聽說過android10中的所有的視頻,音頻以及圖片等資源為了統一的管理,統一放在一個共有的文件下,也就是所謂的沙箱。看了一下其他人寫的文章,也提供了一種簡單粗暴的方式也就是在清單文件application下配置#android:requestLegacyExternalStorage="true"#,但如果android11出來又得適配了,android11是禁止除了共有文件夾下新建視頻,音頻以及圖片等文件。不然就會報找不到文件相關的錯誤,好了說到底我們還是得花點時間去適配android10以上的沙箱適配。
進入正題,接下來我們就來適配Android10相關的拍照以及選擇相冊並兼容android10以下的絕大部分的適配。
進入系統相冊的操作都是一樣的這里就不贅述:
主要的還是要對返回的data進行處理,也就是把uri轉換成文件File的路徑path
當然了拍照和點陣圖Bitmap相關的適配是一樣的。
7.0以上Android版本的路徑配置
第一步
@xml/file_camera_paths 文件配置
拍照首先需要申請拍照許可權
申請完後調用camera就可以拍照,拍照主要就是在調用相機的時需要自己去配置文件存儲路徑。
回調處理這里我就不贅述了 主要是對Android10以上關於圖片配置相關的處理
既然關於Android 10那麼我們也講一下關於定位方面的適配,Android10以上需要在清淡文件中添加一個新的定位許可權
❻ Android 使用系統相機拍照和讀取相冊照片
1.拍照 (對於7.0以上的版本,不在允許直接訪問uri)
`
若不指定輸出路徑intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity)); 在onActivityResult()中,通過
`
可以拿到uri,但獲得的圖片是被壓縮過的。若指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);輸出路徑,則此處的intent為null,但可以使用我們存的uri讀取照片,此時的照片沒有被壓縮。
2.從相冊中讀取照片, 方法:
`
`
即使設置 intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity));輸出路徑,仍然不能從此路徑中讀取,只能在onActivityForResult()中通過event.uri = intent.getData();方式獲得圖片uri。
此種現象也好理解,拍照時產生新的圖片,自然可根據設置的uri進行圖片保存,而讀取相冊時,圖片已經在目錄中不能轉移到自己設定的uri中。
Androidmanifest.xml中
`
在 res/xml/provider_paths.xml
`
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="JDTobs" path=""/>
<files-path name="name" path="path" />
<cache-path name="name" path="path" /> <external-path name="name" path="path" />
<external-files-path name="name" path="path" />
<external-cache-path name="name" path="path" /> </paths> `
讀取uri
❼ Android開發如何從手機相冊中選擇照片
File DatalDir = Environment.getExternalStorageDirectory();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_hhmmss",
Locale.SIMPLIFIED_CHINESE);
String midPath = "DCIM/Camera/"+ sdf.format(new Date())+ ".jpg";
File outMid = new File( DatalDir.getPath() + "/DCIM/Camera");
存這個地址就可以;
❽ 【基礎筆記】Android Studio拍照、選擇相冊(第三方框架)
①選擇指定後綴文件
②在圖片選擇器中選擇圖片或視頻
③接受返回的文件
FilePicker
①、添加依賴
②、Activity實現takephoto
③實例圖片
④Git地址
TakePhoto
❾ Android WebView 調用系統拍照和相冊
由於業務需要,APP內嵌H5,需要調去系統相冊和拍照,網上找了點資料,整理一下,供大家參考:
private static final int REQUEST_CAMERA =1;
private static final int REQUEST_CHOOSE =2;
private ValueCallbackmUploadMessage;
private ;
private UricameraUri;
//5.0以後的方法
webView.setWebChromeClient(new WebChromeClient() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
if (mUploadMessagesAboveL !=null) {
mUploadMessagesAboveL.onReceiveValue(null);
mUploadMessagesAboveL =null;
}else {
mUploadMessagesAboveL = filePathCallback;
selectImage();
}
return true;
}
});
//選擇圖片和拍照,對應的string文件,可以自己寫死:拍照,相冊,取消
private void selectImage() {
ActionSheet.createBuilder(this, getSupportFragmentManager()).
setOtherButtonTitles(new String[]{getResources().getString(R.string.common_tip_photos), getResources().getString(R.string.common_picture)}).
setCancelButtonTitle(getResources().getString(R.string.common_cancel)).setCancelableOnTouchOutside(true).setListener(new ActionSheet.ActionSheetListener() {
public void onDismiss(ActionSheet actionSheet, boolean isCancel) {
if (mUploadMessage !=null) {
mUploadMessage.onReceiveValue(null);
mUploadMessage =null;
}
if (mUploadMessagesAboveL !=null) {
mUploadMessagesAboveL.onReceiveValue(null);
mUploadMessagesAboveL =null;
}
actionSheet.dismiss();
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void onOtherButtonClick(ActionSheet actionSheet, int index) {
switch (index) {
case 0:
chosePicture();
break;
case 1:
setRequestCamera();
}
}
}).show();
}
//拍照,添加許可權申請 這個可以自己寫下,我這邊是項目中寫好的,直接拿過來用了
public void setRequestCamera() {
permissionsBuilder =new YXTPermissionsBuilder.Builder(this)
.setOnGrantedListener((requestCode, perms) -> {
openCamera();
})
.setRationale4NeverAskAgain(LanguageUtils.isEnglish() ? String.format(getString(R.string.permission_tips), getString(R.string.common_camera), getString(R.string.app_name), getString(R.string.app_name)) :
String.format(getString(R.string.permission_tips), getString(R.string.app_name), getString(R.string.common_camera), getString(R.string.app_name)))
//必需
.setRequestCode(ConstantsData.GET_CAMERA)
.build();
permissionsBuilder.requestPermissions(Manifest.permission.CAMERA);
}
/**
* 本地相冊選擇圖片
*/
private void chosePicture() {
Intent innerIntent =new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
innerIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(innerIntent, null);
startActivityForResult(wrapperIntent, REQUEST_CHOOSE);
}
/**
* 打開照相機
*/
private void openCamera() {
Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String imagePaths = Environment.getExternalStorageDirectory().getPath() +"/pbccrc/Images/" + (System.currentTimeMillis() +".jpg");
// 必須確保文件夾路徑存在,否則拍照後無法完成回調
File vFile =new File(imagePaths);
if (!vFile.exists()) {
File vDirPath = vFile.getParentFile();
vDirPath.mkdirs();
}else {
if (vFile.exists()) {
vFile.delete();
}
}
cameraUri = FileProvider.getUriForFile(
this,
getPackageName() +".fileprovider",
vFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
startActivityForResult(intent, REQUEST_CAMERA);
}
/**
* 選擇照片後結束
*
* @param data
*/
private UriafterChosePic(Intent data) {
if (data !=null) {
final String path = data.getData().getPath();
if (path !=null && (path.endsWith(".png") || path.endsWith(".PNG") || path.endsWith(".jpg") || path.endsWith(".JPG"))) {
return data.getData();
}else {
Toast.makeText(this, "上傳的圖片僅支持png或jpg格式", Toast.LENGTH_SHORT).show();
}
}
return null;
}
/**
* 返迴文件選擇
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (mUploadMessagesAboveL !=null) {
onActivityResultAboveL(requestCode, resultCode, intent);
}
if (mUploadMessage ==null)return;
Uri uri =null;
if (requestCode ==REQUEST_CAMERA && resultCode ==RESULT_OK) {
uri =cameraUri;
Log.e("onActivityResult: " + uri.toString());
}
if (requestCode ==REQUEST_CHOOSE && resultCode ==RESULT_OK) {
uri = afterChosePic(intent);
}
mUploadMessage.onReceiveValue(uri);
mUploadMessage =null;
super.onActivityResult(requestCode, resultCode, intent);
}
/**
* 5.0以後機型 返迴文件選擇
*
* @param requestCode
* @param resultCode
* @param data
*/
private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
Uri[] results =null;
if (requestCode ==REQUEST_CAMERA && resultCode ==RESULT_OK) {
results =new Uri[]{cameraUri};
}
if (requestCode ==REQUEST_CHOOSE && resultCode ==RESULT_OK) {
if (data !=null) {
String dataString = data.getDataString();
if (dataString !=null)
results =new Uri[]{Uri.parse(dataString)};
}
}
mUploadMessagesAboveL.onReceiveValue(results);
mUploadMessagesAboveL =null;
return;
}
基本都可以拿去用了,希望有幫助