版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】android中怎么實現(xiàn)在相冊中選擇圖片
這期內(nèi)容當(dāng)中在下將會給大家?guī)碛嘘P(guān)android中怎么實現(xiàn)在相冊中選擇圖片,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。首先在activity_main.xml文件中增加一個Button,用來觸發(fā)從相冊中選擇圖片的功能。<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.cofox.mycameraalbum.MainActivity">
<Button
android:id="@+id/button_take_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Tack
Photo"/>
<Button
android:id="@+id/button_choose_from_album"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Choose
From
Album"/>
<ImageView
android:id="@+id/photo_pictrue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>
</LinearLayout>這段代碼中的android:id="@+id/button_choose_from_album"按鈕就是我們的主角了。然后要在MainActivity.java中,加入從相冊選圖片的邏輯。聲明Button按鈕復(fù)制代碼代碼如下:ButtonbtnChooseFromAlbum=(Button)findViewById(R.id.button_choose_from_album);//相冊選擇圖片按鈕添加按鈕的點擊事件//打開相冊選擇圖片
btnChooseFromAlbum.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
if(ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
}else{
openAlbum();
}
}
});這段代碼中,先要判斷PackageManager.PERMISSION_GRANTED權(quán)限的情況,如果沒有權(quán)限就需要添加,有的話直接openAlbum();打開相冊。ActivityCompat.requestPermissions執(zhí)行獲取權(quán)限的操作,然后由用戶選擇是否給予權(quán)限,根據(jù)用戶的選擇,系統(tǒng)來決定是否可以繼續(xù)執(zhí)行openAlbum()功能。這個就需要用到onRequestPermissionsResult了。代碼的邏輯是,如果給了權(quán)限就執(zhí)行openAlbum(),如果不給權(quán)限就返回給用戶沒有此權(quán)限的提示即可。("Youdeniedthepermision.")@Override
public
void
onRequestPermissionsResult(int
requestCode,
@NonNull
String[]
permissions,
@NonNull
int[]
grantResults)
{
//
super.onRequestPermissionsResult(requestCode,
permissions,
grantResults);
switch
(requestCode){
case
1:
if(grantResults.length
>
0
&&
grantResults[0]
==
PackageManager.PERMISSION_GRANTED){
openAlbum();
}else{
Toast.makeText(this,
"You
denied
the
permision.",
Toast.LENGTH_LONG).show();
}
break;
default:
}
}openAlbum()就是打開相冊,代碼邏輯很清晰吧?但是,還沒完呢。因為如何打開還需要一些邏輯。先看openAlbum()的代碼。private
void
openAlbum()
{
Intent
intent
=
new
Intent("ent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,
CHOOSE_PHOTO);//打開相冊
}這里的Intent是給相冊準備的,然后調(diào)用startActivityForResult()才打開相冊。這時出現(xiàn)的CHOOSE_PHOTO是給onActivityResult中判斷走那個分支的條件參數(shù)。我們應(yīng)該在MainActivity.java中增加一個全局變量聲明public
static
final
int
CHOOSE_PHOTO
=
2;在onActivityResult中增加switchcase的CHOOSE_PHOTO分支。分之內(nèi)根據(jù)不同的系統(tǒng)版本執(zhí)行不同的代碼邏輯。因為android4.4是一個文件訪問安全處理方式的分水嶺,4.4以下的系統(tǒng)使用直接文件地址,4.4及以上系統(tǒng)使用不再返回真實的圖片地址了。所以,代碼的處理方法就有所不同。4.4及以上系統(tǒng)需要對相冊返回的圖片地址進行解析。這里確定分作兩個方法來分別處理handleImageOnKitKat(data)和handeleImageBeforeKitKat(data)。case
CHOOSE_PHOTO:
if(resultCode
==
RESULT_OK){
//判斷手機系統(tǒng)版本號
if(Build.VERSION.SDK_INT
>=
19){
//4.4及以上系統(tǒng)使用這個方法處理圖片
handleImageOnKitKat(data);
}else{
//4.4以下系統(tǒng)使用這個方法處理圖片
handeleImageBeforeKitKat(data);
}
}
break;在handleImageOnKitKat(data)中對地址進行解析,根據(jù)三種不同的提供Uri方式采用不同的方法。document類型的Uricontent類型的urifile類型的Uri
@TargetApi(19)
private
void
handleImageOnKitKat(Intent
data)
{
//
Toast.makeText(this,"到了handleImageOnKitKat(Intent
data)方法了",
Toast.LENGTH_LONG).show();
String
imagePath
=
null;
Uri
uri
=
data.getData();
if(DocumentsContract.isDocumentUri(this,
uri)){
//如果是
document
類型的
Uri,則通過
document
id
處理
String
docId
=
DocumentsContract.getDocumentId(uri);
if("viders.media.documents".equals(uri.getAuthority())){
String
id
=
docId.split(":")[1];//解析出數(shù)字格式的
id
String
selection
=
MediaStore.Images.Media._ID
+
"="
+
id;
imagePath
=
getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
selection);
}else
if("viders.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".equalsIgnoreCase(uri.getScheme())){
//如果是
content
類型的
uri
,
則使用普通方式處理
imagePath
=
getImagePath(uri,
null);
}else
if("file".equalsIgnoreCase(uri.getScheme())){
//如果是
file
類型的
Uri,直接獲取圖片路徑即可
imagePath
=
uri.getPath();
}
displayImage(imagePath);//顯示選中的圖片
}注意那個@TargetApi(19),因為我們的項目最小兼容系統(tǒng)設(shè)置的是15,而代碼中的DocumentsContract.isDocumentUri和DocumentsContract.getDocumentId有系統(tǒng)兼容性需要處理。當(dāng)我們通過各個途徑,已經(jīng)獲取到圖片路徑的之后,自然就是顯示圖片了。于是最后一句代碼就是調(diào)用displayImage方法來實現(xiàn)圖片的顯示了。對于handeleImageBeforeKitKat就要簡單的多了。直接取得地址顯示。
private
void
handeleImageBeforeKitKat(Intent
data){
Uri
uri
=
data.getData();
String
imagePath
=
getImagePath(uri,
null);
displayImage(imagePath);
}中間用到的獲得圖片真實路徑和顯示圖片的方法如下:
private
String
getImagePath(Uri
uri,
String
selection)
{
String
path
=
null;
//通過
Uri
和
selection
來獲取真實的圖片路徑
Cursor
cursor
=
getContentResolver().query(uri,
null,
selection,
null,
null);
if(cursor
!=
null){
if(cursor.moveToFirst()){
path
=
cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return
path;
}
private
void
displayImage(String
imagePath)
{
if(imagePath
!=
null){
Bitmap
bitmap
=
BitmapFactory.decodeFile(imagePath);
picture.setImageBitmap(bitmap);
}else{
Toast.makeText(this,"failed
to
get
image",
Toast.LENGTH_LONG).show();
}
}MainActivity.java完整代碼:package
com.cofox.mycameraalbum;
import
android.Manifest;
import
android.annotation.TargetApi;
import
android.content.ContentUris;
import
android.content.Intent;
import
android.content.pm.PackageManager;
import
android.database.Cursor;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
.Uri;
import
android.os.Build;
import
vider.DocumentsContract;
import
vider.MediaStore;
import
android.support.annotation.NonNull;
import
android.support.v4.app.ActivityCompat;
import
android.support.v4.content.ContextCompat;
import
android.support.v4.content.FileProvider;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.Button;
import
android.widget.ImageView;
import
android.widget.Toast;
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.IOException;
public
class
MainActivity
extends
AppCompatActivity
{
public
static
final
int
TAKE_PHOTO
=
1;
public
static
final
int
CHOOSE_PHOTO
=
2;
private
ImageView
picture;
private
Uri
imageUri;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button
btnTakePhoto
=
(Button)
findViewById(R.id.button_take_photo);
//拍照按鈕
Button
btnChooseFromAlbum
=
(Button)findViewById(R.id.button_choose_from_album);//相冊選擇圖片按鈕
picture
=
(ImageView)
findViewById(R.id.photo_pictrue);
//圖片控件,用來顯示照片的。
//打開相機拍照
btnTakePhoto.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
//創(chuàng)建File對象,用于存儲拍照后的圖片
File
outputImage
=
new
File(getExternalCacheDir(),
"output_image.jpg");
try
{
if
(outputImage.exists())
{
outputImage.delete();
}
outputImage.createNewFile();
}
catch
(IOException
e)
{
e.printStackTrace();
}
//android
7.0版本以下的系統(tǒng),直接Uri.fromFile取得真實文件路徑;7.0及以上版本的系統(tǒng),使用fileprovider封裝過的Uri再提供出去。
if
(Build.VERSION.SDK_INT
>=
24)
{
imageUri
=
FileProvider.getUriForFile(MainActivity.this,
"com.cofox.mycameraalbum.fileprovider",
outputImage);
}
else
{
imageUri
=
Uri.fromFile(outputImage);
}
//啟動相機程序
Intent
intent
=
new
Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,
imageUri);
startActivityForResult(intent,
TAKE_PHOTO);
//啟動Intent活動,拍完照會有結(jié)果返回到onActivityResult()方法中。
}
});
//打開相冊選擇圖片
btnChooseFromAlbum.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
if(ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
}else{
openAlbum();
}
}
});
}
private
void
openAlbum()
{
Intent
intent
=
new
Intent("ent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,
CHOOSE_PHOTO);//打開相冊
}
@Override
public
void
onRequestPermissionsResult(int
requestCode,
@NonNull
String[]
permissions,
@NonNull
int[]
grantResults)
{
//
super.onRequestPermissionsResult(requestCode,
permissions,
grantResults);
switch
(requestCode){
case
1:
if(grantResults.length
>
0
&&
grantResults[0]
==
PackageManager.PERMISSION_GRANTED){
openAlbum();
}else{
Toast.makeText(this,
"You
denied
the
permision.",
Toast.LENGTH_LONG).show();
}
break;
default:
}
}
@Override
protected
void
onActivityResult(int
requestCode,
int
resultCode,
Intent
data)
{
switch
(requestCode)
{
case
TAKE_PHOTO:
if(resultCode
==
RESULT_OK){
try
{
//將拍攝的照片顯示出來
Bitmap
bitmap
=
BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
}
catch
(FileNotFoundException
e)
{
e.printStackTrace();
}
}
break;
case
CHOOSE_PHOTO:
if(resultCode
==
RESULT_OK){
//判斷手機系統(tǒng)版本號
if(Build.VERSION.SDK_INT
>=
19){
//4.4及以上系統(tǒng)使用這個方法處理圖片
handleImageOnKitKat(data);
}else{
//4.4以下系統(tǒng)使用這個方法處理圖片
handeleImageBeforeKitKat(data);
}
}
break;
default:
break;
}
}
@TargetApi(19)
private
void
handleImageOnKitKat(Intent
data)
{
//
Toast.makeText(this,"到了handleImageOnKitKat(Intent
data)方法了",
Toast.LENGTH_LONG).show();
String
imagePath
=
null;
Uri
uri
=
data.getData();
if(DocumentsContract.isDocumentUri(this,
uri)){
//如果是
document
類型的
Uri,則通過
document
id
處理
String
docId
=
DocumentsContract.getDocumentId(uri);
if("viders.media.documents".equals(uri.getAuthority())){
String
id
=
docId.split(":")[1];//解析出數(shù)字格式的
id
String
selection
=
MediaStore.Images.Media._ID
+
"="
+
id;
imagePath
=
getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
selection);
}else
if("viders.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".equalsIgnoreCase(uri.getScheme())){
//如果是
content
類型的
uri
,
則使用普通方式處理
imagePath
=
getImagePath(uri,
null);
}else
if("file".equalsIgnoreCase(uri.getScheme())){
//如果是
file
類型的
Uri,直接獲取圖片路徑即可
imagePath
=
uri.getPath();
}
displayImage(imagePath);//顯示選中的圖片
}
private
void
handeleImageBeforeKitKat(Intent
data){
Uri
uri
=
data.getData();
String
imagePath
=
getImagePath(uri,
null);
displayImage(imagePath);
}
private
String
getImagePath(Uri
uri,
String
selection)
{
String
path
=
null;
//通過
Uri
和
selection
來獲取真實的圖片路徑
Cursor
cursor
=
getContentResolver().query(uri,
null,
selection,
null,
null);
if(cursor
!=
null){
if(cursor.moveToFirst()){
path
=
cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 乙肝防治知識培訓(xùn)課件
- 高爐知識培訓(xùn)課件圖片
- 化工儀表知識培訓(xùn)課件
- 中醫(yī)內(nèi)科學(xué)課件-不寐
- 二零二五年度大數(shù)據(jù)合資公司成立合同范本3篇
- 二零二五年度工程項目合同管理信息化平臺建設(shè)指南3篇
- 2025企業(yè)集團蛇年年會盛典(同心創(chuàng)佳績金蛇啟新章主題)活動策劃方案-60正式版
- 內(nèi)蒙古呼倫貝爾市阿榮旗2024-2025學(xué)年七年級上學(xué)期1月期末語文試卷(含答案)
- 貴州省部分學(xué)校聯(lián)考2024-2025學(xué)年高三上學(xué)期12月月考語文試卷(含答案)
- 安徽省示范高中2024-2025學(xué)年高一(上)期末綜合測試物理試卷(含答案)
- 藝術(shù)哲學(xué):美是如何誕生的學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 鋼箱梁計算分析與案例詳解
- 苯酚及酚類37張課件
- 醫(yī)聯(lián)體綜合績效考核指標體系(醫(yī)聯(lián)體醫(yī)院)
- 中國石油天然氣集團公司建設(shè)項目其他費用和相關(guān)費用的規(guī)定
- 礦業(yè)煤礦企業(yè)NOSA安健環(huán)風(fēng)險管理體系推行工作指南(2022版)
- 新項目開發(fā)商業(yè)計劃書模板ppt
- 2021年中國華電集團公司組織架構(gòu)和部門職能
- 林業(yè)標準林業(yè)調(diào)查規(guī)劃設(shè)計收費依據(jù)及標準
- 數(shù)學(xué)歸納法原理第二歸納法跳躍歸納法反向歸納法
- 七年級數(shù)學(xué)幾何證明題(典型)
評論
0/150
提交評論