【移動應(yīng)用開發(fā)技術(shù)】android中怎么實現(xiàn)在相冊中選擇圖片_第1頁
【移動應(yīng)用開發(fā)技術(shù)】android中怎么實現(xiàn)在相冊中選擇圖片_第2頁
【移動應(yīng)用開發(fā)技術(shù)】android中怎么實現(xiàn)在相冊中選擇圖片_第3頁
【移動應(yīng)用開發(fā)技術(shù)】android中怎么實現(xiàn)在相冊中選擇圖片_第4頁
【移動應(yīng)用開發(fā)技術(shù)】android中怎么實現(xiàn)在相冊中選擇圖片_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論