【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android應(yīng)用如何獲取相冊(cè)中的圖片_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android應(yīng)用如何獲取相冊(cè)中的圖片_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android應(yīng)用如何獲取相冊(cè)中的圖片_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android應(yīng)用如何獲取相冊(cè)中的圖片_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android應(yīng)用如何獲取相冊(cè)中的圖片_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android應(yīng)用如何獲取相冊(cè)中的圖片

這篇文章給大家介紹Android應(yīng)用如何獲取相冊(cè)中的圖片,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。容易出錯(cuò)的地方:1、當(dāng)我們指定了照片的uri路徑,我們就不能通過data.getData();來獲取uri,而應(yīng)該直接拿到uri(用全局變量或者其他方式)然后設(shè)置給imageViewimageView.setImageURI(uri);2、我發(fā)現(xiàn)手機(jī)前置攝像頭拍出來的照片只有幾百KB,直接用imageView.setImageURI(uri);沒有很大問題,但是后置攝像頭拍出來的照片比較大,這個(gè)時(shí)候使用imageView.setImageURI(uri);就容易出現(xiàn)outofmemory(oom)錯(cuò)誤,我們需要先把URI轉(zhuǎn)換為Bitmap,再壓縮bitmap,然后通過imageView.setImageBitmap(bitmap);來顯示圖片。3、將照片存放到SD卡中后,照片不能立即出現(xiàn)在系統(tǒng)相冊(cè)中,因此我們需要發(fā)送廣播去提醒相冊(cè)更新照片。4、這里用到了sharepreference,要注意用完之后移除緩存。代碼:MainActivity:package

.test;

import

android.content.Intent;

import

android.graphics.Bitmap;

import

android.graphics.BitmapFactory;

import

.Uri;

import

android.os.Bundle;

import

android.os.Environment;

import

vider.MediaStore;

import

android.support.v7.app.AppCompatActivity;

import

android.util.Log;

import

android.view.View;

import

android.widget.ImageView;

import

.test.tools.ImageTools;

import

java.io.File;

import

java.io.IOException;

import

java.text.SimpleDateFormat;

import

java.util.Date;

public

class

MainActivity

extends

AppCompatActivity

{

private

static

final

int

PHOTO_FROM_GALLERY

=

1;

private

static

final

int

PHOTO_FROM_CAMERA

=

2;

private

ImageView

imageView;

private

File

appDir;

private

Uri

uriForCamera;

private

Date

date;

private

String

str

=

"";

private

SharePreference

sharePreference;

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//Android不推薦使用全局變量,我在這里使用了sharePreference

sharePreference

=

SharePreference.getInstance(this);

imageView

=

(ImageView)

findViewById(R.id.imageView);

}

//從相冊(cè)取圖片

public

void

gallery(View

view)

{

Intent

intent

=

new

Intent();

intent.setType("image/*");

intent.setAction(Intent.ACTION_GET_CONTENT);

startActivityForResult(intent,

PHOTO_FROM_GALLERY);

}

//拍照取圖片

public

void

camera(View

view)

{

Intent

intent

=

new

Intent(MediaStore.ACTION_IMAGE_CAPTURE);

uriForCamera

=

Uri.fromFile(createImageStoragePath());

sharePreference.setCache("uri",

String.valueOf(uriForCamera));

/**

*

指定了uri路徑,startActivityForResult不返回intent,

*

所以在onActivityResult()中不能通過data.getData()獲取到uri;

*/

intent.putExtra(MediaStore.EXTRA_OUTPUT,

uriForCamera);

startActivityForResult(intent,

PHOTO_FROM_CAMERA);

}

@Override

protected

void

onActivityResult(int

requestCode,

int

resultCode,

Intent

data)

{

super.onActivityResult(requestCode,

resultCode,

data);

//第一層switch

switch

(requestCode)

{

case

PHOTO_FROM_GALLERY:

//第二層switch

switch

(resultCode)

{

case

RESULT_OK:

if

(data

!=

null)

{

Uri

uri

=

data.getData();

imageView.setImageURI(uri);

}

break;

case

RESULT_CANCELED:

break;

}

break;

case

PHOTO_FROM_CAMERA:

if

(resultCode

==

RESULT_OK)

{

Uri

uri

=

Uri.parse(sharePreference.getString("uri"));

updateDCIM(uri);

try

{

//把URI轉(zhuǎn)換為Bitmap,并將bitmap壓縮,防止OOM(out

of

memory)

Bitmap

bitmap

=

ImageTools.getBitmapFromUri(uri,

this);

imageView.setImageBitmap(bitmap);

}

catch

(IOException

e)

{

e.printStackTrace();

}

removeCache("uri");

}

else

{

Log.e("result",

"is

not

ok"

+

resultCode);

}

break;

default:

break;

}

}

/**

*

設(shè)置相片存放路徑,先將照片存放到SD卡中,再操作

*

*

@return

*/

private

File

createImageStoragePath()

{

if

(hasSdcard())

{

appDir

=

new

File("/sdcard/testImage/");

if

(!appDir.exists())

{

appDir.mkdirs();

}

SimpleDateFormat

simpleDateFormat

=

new

SimpleDateFormat("yyyyMMddHHmmss");

date

=

new

Date();

str

=

simpleDateFormat.format(date);

String

fileName

=

str

+

".jpg";

File

file

=

new

File(appDir,

fileName);

return

file;

}

else

{

Log.e("sd",

"is

not

load");

return

null;

}

}

/**

*

將照片插入系統(tǒng)相冊(cè),提醒相冊(cè)更新

*

*

@param

uri

*/

private

void

updateDCIM(Uri

uri)

{

Intent

intent

=

new

Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

intent.setData(uri);

this.sendBroadcast(intent);

Bitmap

bitmap

=

BitmapFactory.decodeFile(uri.getPath());

MediaStore.Images.Media.insertImage(getContentResolver(),

bitmap,

"",

"");

}

/**

*

判斷SD卡是否可用

*

*

@return

*/

private

boolean

hasSdcard()

{

if

(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

{

return

true;

}

else

{

return

false;

}

}

/**

*

移除緩存

*

*

@param

cache

*/

private

void

removeCache(String

cache)

{

if

(sharePreference.ifHaveShare(cache))

{

sharePreference.removeOneCache(cache);

}

else

{

Log.e("this

cache",

"is

not

exist.");

}

}

}ImageTools:package

.test.tools;

import

android.app.Activity;

import

android.graphics.Bitmap;

import

android.graphics.BitmapFactory;

import

.Uri;

import

java.io.ByteArrayInputStream;

import

java.io.ByteArrayOutputStream;

import

java.io.FileNotFoundException;

import

java.io.IOException;

import

java.io.InputStream;

public

class

ImageTools

{

/**

*

通過uri獲取圖片并進(jìn)行壓縮

*

*

@param

uri

*

@param

activity

*

@return

*

@throws

IOException

*/

public

static

Bitmap

getBitmapFromUri(Uri

uri,

Activity

activity)

throws

IOException

{

InputStream

inputStream

=

activity.getContentResolver().openInputStream(uri);

BitmapFactory.Options

options

=

new

BitmapFactory.Options();

options.inJustDecodeBounds

=

true;

options.inDither

=

true;

options.inPreferredConfig

=

Bitmap.Config.ARGB_8888;

BitmapFactory.decodeStream(inputStream,

null,

options);

inputStream.close();

int

originalWidth

=

options.outWidth;

int

originalHeight

=

options.outHeight;

if

(originalWidth

==

-1

||

originalHeight

==

-1)

{

return

null;

}

float

height

=

800f;

float

width

=

480f;

int

be

=

1;

//be=1表示不縮放

if

(originalWidth

>

originalHeight

&&

originalWidth

>

width)

{

be

=

(int)

(originalWidth

/

width);

}

else

if

(originalWidth

<

originalHeight

&&

originalHeight

>

height)

{

be

=

(int)

(originalHeight

/

height);

}

if

(be

<=

0)

{

be

=

1;

}

BitmapFactory.Options

bitmapOptinos

=

new

BitmapFactory.Options();

bitmapOptinos.inSampleSize

=

be;

bitmapOptinos.inDither

=

true;

bitmapOptinos.inPreferredConfig

=

Bitmap.Config.ARGB_8888;

inputStream

=

activity.getContentResolver().openInputStream(uri);

Bitmap

bitmap

=

BitmapFactory.decodeStream(inputStream,

null,

bitmapOptinos);

inputStream.close();

return

compressImage(bitmap);

}

/**

*

質(zhì)量壓縮方法

*

*

@param

bitmap

*

@return

*/

public

static

Bitmap

compressImage(Bitmap

bitmap)

{

ByteArrayOutputStream

byteArrayOutputStream

=

new

ByteArrayOutputStream();

press(Bitmap.CompressFormat.JPEG,

100,

byteArrayOutputStream);

int

options

=

100;

while

(byteArrayOutputStream.toByteArray().length

/

1024

>

100)

{

byteArrayOutputStream.reset();

//第一個(gè)參數(shù)

:圖片格式

,第二個(gè)參數(shù):

圖片質(zhì)量,100為最高,0為最差

,第三個(gè)參數(shù):保存壓縮后的數(shù)據(jù)的流

press(Bitmap.CompressFormat.JPEG,

options,

byteArrayOutputStream);

options

-=

10;

}

ByteArrayInputStream

byteArrayInputStream

=

new

ByteArrayInputStream(byteArrayOutputStream.toByteArray());

Bitmap

bitmapImage

=

BitmapFactory.decodeStream(byteArrayInputStream,

null,

null);

return

bitmapImage;

}

}AndroidMainfest.xml:<?xml

version="1.0"

encoding="utf-8"?>

<manifest

package=".test"

xmlns:android="/apk/res/android">

<uses-feature

android:name="android.hardware.camera"

android:required="true"

/>

<uses-permission

android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission

android:name="android.permission.CAMERA"/>

<uses-permission

android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission

android:name="com.miui.whetstone.permission.ACCESS_PROVIDER"/>

<uses-permission

android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-feature

android:name="android.hardware.camera.autofocus"

/>

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity

android:name=".MainActivity">

<intent-filter>

<action

android:name="ent.action.MAIN"/>

<category

android:name="ent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

</manifest>activity_main.xml:<?xml

version="1.0"

encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

xmlns:tools="/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#fff"

android:orientation="vertical"

tools:context=".test.MainActivity">

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論