最近遇到了一个更换头像的问题,虽然我知道网上有一大摞资料,我也查了,但是并不是太满意,可能是思想问题吧。更换头像,首先肯定是两种方式。第一,自己拍照上传,这个很简单,调用一下照相机,然后存到某个文件夹下,然后在调出来就可以ok了,调出系统的照相机也是非常简单,几行代码的事,网上一大摞的资料。但是怎么获取本地的照片然后进行上传的,我觉得肯定是遍历sd卡然后找到图片文件,图片也不是只有一张,又怎么知道被选中了呢,也许这个问题是我担心过度了,想太多了。其实就是应该打开文件选择器,然后找到自己想要的,再获取图片路径,最后使用一个方法就能完成了。下面我贴代码。布局文件只有一个button和ImageView,就不想贴出来了。

package com.cocos.yuriko;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
	private static final int FILE_SELECT_CODE = 1;
	private Button button1;
	private ImageView imageView1;
	private String path;

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1 = (Button) findViewById(R.id.button1);
		imageView1 = (ImageView) findViewById(R.id.imageView1);
		button1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				showFileChooser();
			}
		});
	}

	// 打开文件选择器
	private void showFileChooser() {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		// 打开时出现的文件目录,也就是根目录
		intent.setType("*/*");
		// 打开选择器的动作
		intent.addCategory(Intent.CATEGORY_OPENABLE);

		try {
			// 启动这个Activity
			this.startActivityForResult(
					Intent.createChooser(intent, "Select a File to Upload"),
					FILE_SELECT_CODE);
		} catch (android.content.ActivityNotFoundException ex) {
			// Toast,不需要解释太多
			Toast.makeText(this, "Please install a File Manager.",
					Toast.LENGTH_SHORT).show();
		}
	}

	// 回调方法
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case FILE_SELECT_CODE:
			if (resultCode == RESULT_OK) {
				// Get the Uri of the selected file
				Uri uri = data.getData();
				// 调用该方法返回选中文件的路径,也可以通过下面的方法设置它的路径然后
				//可以在其他地方通过get方法得到路径,也可以方便更换图片
				// String path=FileUtils.getPath(this, uri);
				this.setPath(FileUtils.getPath(this, uri));
				Toast.makeText(MainActivity.this, path, Toast.LENGTH_SHORT)
						.show();
			}
			break;
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
}

class FileUtils {
	// 获取路径
	//目前这个方法不太懂,不过没关系,能用就行了,希望大家能谅解
	public static String getPath(Context context, Uri uri) {

		if ("content".equalsIgnoreCase(uri.getScheme())) {
			String[] projection = { "_data" };
			Cursor cursor = null;

			try {
				cursor = context.getContentResolver().query(uri, projection,
						null, null, null);
				int column_index = cursor.getColumnIndexOrThrow("_data");
				if (cursor.moveToFirst()) {
					return cursor.getString(column_index);
				}
			} catch (Exception e) {
				// Eat it
			}
		}

		else if ("file".equalsIgnoreCase(uri.getScheme())) {
			return uri.getPath();
		}

		return null;
	}

}

这一步可以做大打开文件选择器,而且可以获取到全路径。既然我们可以获得全路径,那么我们就好办了,这些方法除了那个回调的方法

onActivityResult()其他的都可以封装起

来,getPath()这个方法直接可以拿过来,showFileChooser()需要添加一个Activity参数即可。下面我把换图片的代码贴出来

//将sd卡图片加载到Imageview中
	 public void Readsdimage(ImageView imageview,String path){
		 BitmapFactory.Options options=new BitmapFactory.Options();
		 options.inSampleSize=2;
		 Bitmap bm=BitmapFactory.decodeFile(path,options);
		 imageview.setImageBitmap(bm);
	 }



使用这个方法需要添加一个ImageView控件和一个path路径,路径在上面已经可以获得了,至于ImageView控件就是在xml布局中写出来就行了。如果大家使用封装的话这个方法直接在Activity里使用即可,把ImageView控件放进去即可,记住一定要先绑定然后才能用这个方法。