朋友让帮忙写一个读取SD卡图片的功能
刚和女朋友吵架闹分手
脑壳昏昏沉沉的来写出来了这个Demo
http://download.csdn.net/detail/u013476751/7428635
测试可用
写的过程中遇到了很多问题
最大的问题就是读取图片时内存泄露
这个通过回收bitmap可以解决
我也没找到更好的办法
毕竟刚和女朋友吵架
心情烦躁
也不想去了解多了
女人就是难将就
1. 下面是主要的获取图片的类:
package com.ccniit.getpictures;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class GetPicture extends Activity {
ImageView image;
private final String IMAGE_TYPE = "image/*";
private final int IMAGE_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.get_picture_main);
Button getPictureBtn = (Button) findViewById(R.id.get_Picture_btn);
image = (ImageView)findViewById(R.id.show_picture);
getPictureBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
getAlbum.setType(IMAGE_TYPE);
startActivityForResult(getAlbum, IMAGE_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) { //此处的 RESULT_OK 是系统自定义得一个常量
return;
}
Bitmap bitmap = null;
ContentResolver resolver = getContentResolver();
if (requestCode == IMAGE_CODE) {
try {
Uri originalUri = data.getData(); //获得图片的uri
bitmap = MediaStore.Images.Media.getBitmap(resolver, originalUri); //显得到bitmap图片
// 这里开始的第二部分,获取图片的路径:
String[] proj = {MediaStore.Images.Media.DATA};
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(originalUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
//最后根据索引值获取图片路径
String path = cursor.getString(column_index);
BitmapFactory.Options options=new Options();
options.inDither=false; /*不进行图片抖动处理*/
options.inPreferredConfig=null; /*设置让解码器以最佳方式解码*/
options.inSampleSize=4; /*图片长宽方向缩小倍数*/
bitmap = BitmapFactory.decodeFile(path,options);
image.setImageBitmap(bitmap);
Log.e("Lostinai",path);
}catch (IOException e) {
Log.e("Lostinai",e.toString());
} finally{
//这里很重要,否则就是内存泄露
if (bitmap.isRecycled()) {
bitmap.recycle();
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.get_picture, menu);
return true;
}
}
2. 安卓的配置文件,也就是拿来显示图片的,我做的简单,毕竟实现功能就行了。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".GetPicture" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginLeft="100sp"
android:text="@string/hello_world" />
<Button
android:id="@+id/get_Picture_btn"
android:layout_width="120sp"
android:layout_height="50sp"
android:layout_marginLeft="80sp"
android:layout_marginTop="100sp"
android:text="@string/get_picture"
/>
<ImageView
android:id="@+id/show_picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="50sp"
android:layout_marginTop="160sp"
android:contentDescription="@string/show_picture" />
</RelativeLayout>
3. 最后的话主要是要添加这三个权限,在AndroidMenifest.xml中添加
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<uses-permission android:name="android.permission.RESTART_PACKAGES" ></uses-permission>
好了
就这样点东西,可以自己写个Demo试试
或者直接去下载上面的文档
下面是运行结果