最近遇到了一个更换头像的问题,虽然我知道网上有一大摞资料,我也查了,但是并不是太满意,可能是思想问题吧。更换头像,首先肯定是两种方式。第一,自己拍照上传,这个很简单,调用一下照相机,然后存到某个文件夹下,然后在调出来就可以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控件放进去即可,记住一定要先绑定然后才能用这个方法。