首先是xml文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin"> <ImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="200dp" android:background="@android:color/holo_red_light" /> <Button android:id="@+id/camera_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="照相机" /> <Button android:id="@+id/gallery_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="图库" /> <Button android:id="@+id/dialog_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="对话框" /> </LinearLayout>然后是java代码:
<pre name="code" class="java">package com.ymhd.mifen.setting; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import com.example.mifen.R; import com.ymhd.mifei.tool.CircleImageView; import com.ymhd.mifen.http.APP_url; import net.sf.json.JSONObject; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; public class editmyself extends Activity { private ImageView settingedit_back; private LinearLayout settingaddress; private CircleImageView mHeaderImage;//头像 // private static int CAMERA_REQUST_CODE = 1; private static int GALLERY_REQUST_CODE = 2; private static int CROP_REQUST_CODE = 3; private APP_url mApp = new APP_url(); private SharedPreferences sp; private String mPictureFile, filePath; // @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.setting_edit_myself); init(); } public void init() { sp = getSharedPreferences("token&refreshtoken", Context.MODE_PRIVATE); settingedit_back = (ImageView) findViewById(R.id.settingedit_back); settingaddress = (LinearLayout) findViewById(R.id.setting_address); //头像 mHeaderImage = (CircleImageView) findViewById(R.id.myself_header); mHeaderImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showHeaderDialog(); } }); // settingedit_back.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); settingaddress.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent in = new Intent(editmyself.this, address.class); startActivity(in); } }); } /** * 弹出头像对话框 */ public void showHeaderDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(editmyself.this); //先得到构造器 builder.setTitle("更换头像"); //设置标题 builder.setIcon(R.drawable.ic_launcher);//设置图标,图片id即可 builder.setPositiveButton("拍照", new DialogInterface.OnClickListener() { //设置确定按钮 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //关闭dialog //拍照的intent---action Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUST_CODE); } }); builder.setNegativeButton("从相册选择", new DialogInterface.OnClickListener() { //设置取消按钮 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); galleryIntent.setType("image/*"); startActivityForResult(galleryIntent, GALLERY_REQUST_CODE); } }); //参数都设置完成了,创建并显示出来 builder.create().show(); } public String getPhotoPath() { return Environment.getExternalStorageDirectory() + "/DCIM/"; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("filePath", filePath); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if (TextUtils.isEmpty(filePath)) { filePath = savedInstanceState.getString("filePath"); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //如果返回码是照相机返回码,就进行以下处理 if (requestCode == CAMERA_REQUST_CODE) { if (data == null) { return; } else { Bundle extras = data.getExtras(); if (extras != null) { Bitmap bitmap = extras.getParcelable("data"); Uri uri = saveBitMap(bitmap); startImageZoom(uri); } } //如果返回码是相册,就进行处理 } else if (requestCode == GALLERY_REQUST_CODE) { if (data == null) { return; } else { Uri contentUri = data.getData(); Uri fileUri = convertUri(contentUri); startImageZoom(fileUri); } //图片裁剪界面返回码 } else if (requestCode == CROP_REQUST_CODE) { if (data == null) { return; } Bundle bundle = data.getExtras(); Bitmap bitMap = bundle.getParcelable("data"); mHeaderImage.setImageBitmap(bitMap); sendImageToServer(bitMap); } } /** * 发送图片到服务器 * * @param bitmap */ private void sendImageToServer(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 85, baos); byte[] bytes = baos.toByteArray(); String imageStr = new String(bytes); //到此已经得到了头像的字节字符串 asyncLoadPicture(imageStr.trim()); } /** * 将修改头像数据(字符串)上传到服务器 * * @param avater */ public void asyncLoadPicture(final String avater) { new AsyncTask() { @Override protected Object doInBackground(Object[] params) { JSONObject data = null; try { data = mApp.putMemberInfoByAvatar(sp.getString("logintoken", ""), avater); } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return data; } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); } }.execute(); } /** * 启动图片裁剪界面 * * @param uri */ private void startImageZoom(Uri uri) { Intent imageZoomIntent = new Intent("com.android.camera.action.CROP"); imageZoomIntent.setDataAndType(uri, "image/*"); imageZoomIntent.putExtra("crop", "true"); imageZoomIntent.putExtra("aspectX", 1); imageZoomIntent.putExtra("aspectY", 1); imageZoomIntent.putExtra("outputX", 150); imageZoomIntent.putExtra("outputY", 150); imageZoomIntent.putExtra("return-data", true); startActivityForResult(imageZoomIntent, CROP_REQUST_CODE); } /** * 将content的uri转成file的uri * * @param contentUri * @return */ private Uri convertUri(Uri contentUri) { InputStream is = null; try { is = getContentResolver().openInputStream(contentUri); Bitmap bitMap = BitmapFactory.decodeStream(is); is.close(); return saveBitMap(bitMap); } catch (FileNotFoundException e) { return null; } catch (IOException e) { e.printStackTrace(); return null; } } /** * 保存bitmap图像到本地文件 * * @param bitMap * @return返回一个file类型的uri */ private Uri saveBitMap(Bitmap bitMap) { //获取保存到的文件夹路劲 File rootFile = new File(Environment.getExternalStorageDirectory() + "/com.bruce"); if (!rootFile.exists()) { rootFile.mkdirs(); } SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");//格式大小写有区别 String sysDatetime = fmt.format(Calendar.getInstance().getTime());//2016年02月25日 13:23:40 mPictureFile = sysDatetime + ".jpg"; filePath = getPhotoPath() + mPictureFile;//获取保存到的文件夹路劲 //保存的文件file // File imageFile = new File(rootFile.getAbsolutePath() + "image.png"); File imageFile = new File(filePath); try { FileOutputStream fos = new FileOutputStream(imageFile); /** * 将图像压缩--图像格式--图像压缩质量--输出流 */ bitMap.compress(Bitmap.CompressFormat.PNG, 85, fos); fos.flush(); fos.close(); return Uri.fromFile(imageFile); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bruce.testpicture"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <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="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>