上传头像(拍照或者本地上传)

来源:互联网 发布:完美软件视频 编辑:程序博客网 时间:2024/05/21 11:04

activity_main.xml

<LinearLayout 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:gravity="center_horizontal"    android:orientation="vertical">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="头像" />        <ImageView            android:id="@+id/iv_personal_icon"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="end"            android:src="@mipmap/ic_launcher" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="用户名" />        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="end"            android:text="12345" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="昵称" />        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="end"            android:text="12345" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="性别" />        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="end"            android:text="男" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="出生日期" />        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="end"            android:text="12345" />    </LinearLayout>    <TextView        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="2.5"        android:background="#ddd" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:id="@+id/btn_change"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="center_horizontal"            android:text="拍照" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:id="@+id/btn_change1"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="center_horizontal"            android:text="从相册选取" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:orientation="horizontal">        <TextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:layout_weight="1"            android:gravity="center_horizontal"            android:text="取消" />    </LinearLayout></LinearLayout>

ImageUtils.java

package app.my.com.day19;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.RectF;import android.net.Uri;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/** * Created by lenovo on 2017/12/20. */public class ImageUtils {    public static String savePhoto(Bitmap photoBitmap, String path,                                   String photoName) {        String localPath = null;        if (android.os.Environment.getExternalStorageState().equals(                android.os.Environment.MEDIA_MOUNTED)) {            File dir = new File(path);            if (!dir.exists()) {                dir.mkdirs();            }            File photoFile = new File(path, photoName + ".png");            FileOutputStream fileOutputStream = null;            try {                fileOutputStream = new FileOutputStream(photoFile);                if (photoBitmap != null) {                    if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100,                            fileOutputStream)) { // 转换完成                        localPath = photoFile.getPath();                        fileOutputStream.flush();                    }                }            } catch (FileNotFoundException e) {                photoFile.delete();                localPath = null;                e.printStackTrace();            } catch (IOException e) {                photoFile.delete();                localPath = null;                e.printStackTrace();            } finally {                try {                    if (fileOutputStream != null) {                        fileOutputStream.close();                        fileOutputStream = null;                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return localPath;    }    /**     * 转换图片成圆形     *     * @param bitmap 传入Bitmap对象     * @param tempUri     * @return     */    public static Bitmap toRoundBitmap(Bitmap bitmap, Uri tempUri) {        int width = bitmap.getWidth();        int height = bitmap.getHeight();        float roundPx;        float left,top,right,bottom,dst_left,dst_top,dst_right,dst_bottom;        if (width <= height) {            roundPx = width / 2;            top = 0;            bottom = width;            left = 0;            right = width;            height = width;            dst_left = 0;            dst_top = 0;            dst_right = width;            dst_bottom = width;        } else {            roundPx = height / 2;            float clip = (width - height) / 2;            left = clip;            right = width - clip;            top = 0;            bottom = height;            width = height;            dst_left = 0;            dst_top = 0;            dst_right = height;            dst_bottom = height;        }        Bitmap output = Bitmap.createBitmap(width,                height, Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(output);        final int color = 0xff424242;        final Paint paint = new Paint();        final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom);        final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom);        final RectF rectF = new RectF(dst);        paint.setAntiAlias(true);        canvas.drawARGB(0, 0, 0, 0);        paint.setColor(color);        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));        canvas.drawBitmap(bitmap, src, dst, paint);        return output;    }}





MainActivity.java

package app.my.com.day19;import android.app.Activity;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import java.io.File;public class MainActivity extends Activity {    protected static final int CHOOSE_PICTURE = 0;    protected static final int TAKE_PICTURE = 1;    private static final int CROP_SMALL_PICTURE = 2;    protected static Uri tempUri;    private ImageView iv_personal_icon;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView btn_change = findViewById(R.id.btn_change);        TextView btn_change1 = findViewById(R.id.btn_change1);        iv_personal_icon = (ImageView) findViewById(R.id.iv_personal_icon);        btn_change.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                showChoosePicDialog();            }        });        btn_change1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                showChoosePicDialog();            }        });    }    /**     * 显示修改头像的对话框     */    protected void showChoosePicDialog() {        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setTitle("设置头像");        String[] items = {"选择本地照片", "拍照"};        builder.setNegativeButton("取消", null);        builder.setItems(items, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                switch (which) {                    case CHOOSE_PICTURE: // 选择本地照片                        Intent openAlbumIntent = new Intent(                                Intent.ACTION_GET_CONTENT);                        openAlbumIntent.setType("image/*");                        startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);                        break;                    case TAKE_PICTURE: // 拍照                        Intent openCameraIntent = new Intent(                                MediaStore.ACTION_IMAGE_CAPTURE);                        tempUri = Uri.fromFile(new File(Environment                                .getExternalStorageDirectory(), "image.jpg"));                        // 指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换                        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);                        startActivityForResult(openCameraIntent, TAKE_PICTURE);                        break;                }            }        });        builder.create().show();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK) { // 如果返回码是可以用的            switch (requestCode) {                case TAKE_PICTURE:                    startPhotoZoom(tempUri); // 开始对图片进行裁剪处理                    break;                case CHOOSE_PICTURE:                    startPhotoZoom(data.getData()); // 开始对图片进行裁剪处理                    break;                case CROP_SMALL_PICTURE:                    if (data != null) {                        setImageToView(data); // 让刚才选择裁剪得到的图片显示在界面上                    }                    break;            }        }    }    /**     * 裁剪图片方法实现     *     * @param uri     */    protected void startPhotoZoom(Uri uri) {        if (uri == null) {            Log.i("tag", "The uri is not exist.");        }        tempUri = uri;        Intent intent = new Intent("com.android.camera.action.CROP");        intent.setDataAndType(uri, "image/*");        // 设置裁剪        intent.putExtra("crop", "true");        // aspectX aspectY 是宽高的比例        intent.putExtra("aspectX", 1);        intent.putExtra("aspectY", 1);        // outputX outputY 是裁剪图片宽高        intent.putExtra("outputX", 150);        intent.putExtra("outputY", 150);        intent.putExtra("return-data", true);        startActivityForResult(intent, CROP_SMALL_PICTURE);    }    /**     * 保存裁剪之后的图片数据     *     * @param     * @param     */    protected void setImageToView(Intent data) {        Bundle extras = data.getExtras();        if (extras != null) {            Bitmap photo = extras.getParcelable("data");            photo = ImageUtils.toRoundBitmap(photo, tempUri); // 这个时候的图片已经被处理成圆形的了            iv_personal_icon.setImageBitmap(photo);            uploadPic(photo);        }    }    private void uploadPic(Bitmap bitmap) {        // 上传至服务器        // ... 可以在这里把Bitmap转换成file,然后得到file的url,做文件上传操作        // 注意这里得到的图片已经是圆形图片了        // bitmap是没有做个圆形处理的,但已经被裁剪了        String imagePath = ImageUtils.savePhoto(bitmap, Environment                .getExternalStorageDirectory().getAbsolutePath(), String                .valueOf(System.currentTimeMillis()));        Log.e("imagePath", imagePath + "");        if (imagePath != null) {            // 拿着imagePath上传了            // ...            Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show();        }    }}




原创粉丝点击