Android头像的选择并上传到阿里云服务器

Android头像的选择
纲要:使用的图库或拍照上传到阿里云服务器,返回给自己的服务端,然后在加载到客户端。

  • 关于这头像的选择网上资料太多了以下纯属个人观点。

1.使用相册和拍照的时候能适用于大部分手机,但是ZTE BA190这款手机在图库选择的时候会出现的异常(加了权限并不能解决问题,有人说是image%3A11577这里特殊处理下,一般都是/,暂时没有尝试),拍照还是可以正常使用,并且绝大部分的手机相册和拍照,传统的选择上传方式都是可以满足的。
这里写图片描述
关键的代码块 这里是用了ButterKnife这个插件变量的申明就简单些:
代码块

`
//这里我继承了BaseActivity 是自己写的类封装了一点加载的时候的提示框 
public class ProfileActivity extends BaseActivity implements View.OnClickListener {
    @BindView(R.id.mBack)
    ImageView mBack;
    //这里是自定义的圆形头像
    @BindView(R.id.head)
    BoderCircleImageView head;
    @BindView(R.id.head_update)
    LinearLayout headUpdate;
    @BindView(R.id.textName)
    TextView textName;
    @BindView(R.id.mName)
    LinearLayout mName;
    @BindView(R.id.man)
    TextView man;
    @BindView(R.id.woman)
    TextView woman;
    @BindView(R.id.pwwd)
    TextView pwwd;
    @BindView(R.id.myQming)
    LinearLayout myQming;
    @BindView(R.id.bind_phone)
    LinearLayout bindPhone;
    @BindView(R.id.update_pwd)
    LinearLayout updatePwd;
    @BindView(R.id.exit_btn)
    Button exitBtn;
    @BindView(R.id.mPhone)
    TextView mPhone;
    private ACache mCache;
    EditText editTextt;
    /**
     * 用于上传的头像文件
     */
       File file;
    File PHOTO_DIR = null;// 拍照的照片存储位置
    String mFileName = "temp_cropped.jpg";// 图片名称
    String photoPath = "";// 图片保存路径
    public static final int PHOTO_ALBUM = 0x10;// 相册返回结果
    public static final int PHOTO_CAMERA = 0x11;// 拍照返回结果
    public static final int PHOTO_RESULT = 0x12;// 剪切返回结果

    /**
     * 阿里云图片上传
     */
    // 运行sample前需要配置以下字段为有效的值
    //文件存储目录
    private String endpoint = "后台给你的上传地址";
    private static final String testBucket = "后台给你的目录名";
    private String accessKeyId = "你自己阿里云的accessKeyId ";
    private String accessKeySecret = "你自己阿里云的accessKeySecret ";
    private String uploadFilePath;
    private String uploadObject;

    private OSS oss;
    private String str;
    String img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        StatusTitleUtils.setStatus(R.color.colorGreen, this);//设置状态栏颜色
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_profile);
        ButterKnife.bind(this);
        // 初始化图片保存路径
        photoPath = HttpConfig.PATH;
        PHOTO_DIR = new File(photoPath);
        // 在onCreate里通过get方式获取缓存实例
        mCache = ACache.get(this);
        /**
         *上传到oss
         */
        OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret);
        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
        conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
        conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个
        conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
        OSSLog.enableLog();
        oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
        //获取会员信息
        getUserInforTask();
        uploadObject = mCache.getAsString("id");
    }

    /**
     * 获取用户信息任务
     */
    void getUserInforTask() {
        RequestParams params = new RequestParams(HttpConfig.WIP + "appmember/member/detail");
        params.addBodyParameter("id", mCache.getAsString("id"));
        new HttpRequest(UserInforEntity.class).post(params, new HttpCallBack() {
            @Override
            public void update(Object object) {
                UserInforEntity entity = (UserInforEntity) object;
                if (entity.isSuccess()) {
                    textName.setText(entity.getData().getNickName());
                    mPhone.setText(entity.getData().getPhone());
                    img = entity.getData().getImg();
                    Log.e("===444====", "" + img);
                    if (entity.getData().getImg() != "") {
                        Glide.with(ProfileActivity.this).load(entity.getData().getImg()).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(head);
                        ACache.get(ProfileActivity.this).put("AVATAR", entity.getData().getImg());
                    }
                } else {
                    Toast.makeText(ProfileActivity.this.getApplicationContext(), entity.getMsg(), Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @OnClick({R.id.mBack, R.id.head_update, R.id.mName, R.id.man, R.id.woman, R.id.pwwd, R.id.myQming, R.id.bind_phone, R.id.update_pwd, R.id.exit_btn})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.mBack:
                finish();
                break;
            case R.id.head_update:
            //你只需要看执行这个方法的后续操作,从拍照或者图库→上传阿里云服务器→自己服务器→客户端显示的过程
                ShowPickDialog();
                break;
            case R.id.mName:
                editTextt = new EditText(this);
                new AlertDialog.Builder(this).setView(editTextt).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int which) {
                        RequestParams params = new RequestParams(HttpConfig.WIP + "appmember/member/nickName");
                        String nick_name = editTextt.getText().toString();
                        params.addBodyParameter("id", mCache.getAsString("id"));
                        params.addBodyParameter("spId", HttpConfig.SPID);
                        params.addBodyParameter("nickName", nick_name);
                        if (nick_name != null && !nick_name.equals("")) {
                            showLoading("数据请求中...");
                            x.http().post(params, new Callback.CommonCallback<String>() {
                                @Override
                                public void onSuccess(String result) {
                                    Log.e("onSuccess", "" + result);
                                    Log.e("id", "" + mCache.getAsString("id"));
                                    Gson gson = new Gson();
                                    BaseEntity baseEntity = gson.fromJson(result, BaseEntity.class);
                                    int httpcode = baseEntity.getHttpCode();
                                    if (httpcode == 200) {
                                        //点击确定
                                        textName.setText(editTextt.getText().toString());
                                        mCache.put("NICKNAME", editTextt.getText().toString());
                                        sendBroadcast();
                                        dissmissLoading();
                                        Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
                                    } else {
                                        Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
                                    }
                                }

                                @Override
                                public void onError(Throwable ex, boolean isOnCallback) {
                                    dissmissLoading();
                                }

                                @Override
                                public void onCancelled(CancelledException cex) {

                                }

                                @Override
                                public void onFinished() {

                                }
                            });
                        } else {
                            Toast.makeText(ProfileActivity.this.getApplicationContext(), "昵称不能为空!", Toast.LENGTH_SHORT).show();
                        }


                    }
                }).show();
                break;
            case R.id.man:
                man.setBackgroundResource(R.drawable.edge_left_down);
                woman.setBackgroundResource(R.drawable.edge_center);
                pwwd.setBackgroundResource(R.drawable.edge_right_down);
                break;
            case R.id.woman:
                woman.setBackgroundResource(R.color.colorGreen);
                man.setBackgroundResource(R.drawable.edge_left);
                pwwd.setBackgroundResource(R.drawable.edge_right_down);
                break;
            case R.id.pwwd:
                man.setBackgroundResource(R.drawable.edge_left);
                woman.setBackgroundResource(R.drawable.edge_center);
                pwwd.setBackgroundResource(R.drawable.edge_right);
                break;
            case R.id.myQming:
                break;
            case R.id.bind_phone:
                startActivity(new Intent(ProfileActivity.this, UpdatePhoneActivity.class));
                break;
            case R.id.update_pwd:
                startActivity(new Intent(this, ForgetActivity.class));
                break;
            case R.id.exit_btn:
                exitBtn.setEnabled(false);
                RequestParams params = new RequestParams(HttpConfig.WIP +
                        "/appmember/member/logout");
                params.addBodyParameter("id", mCache.getAsString("id"));
                new HttpRequest(IsExitEntity.class).post(params, new
                        HttpCallBack() {
                            @Override
                            public void update(Object object) {
                                exitBtn.setEnabled(true);
                                IsExitEntity entity = (IsExitEntity) object;
                                if (entity.isSuccess() && entity.isData()) {
                                    //mCache.clear();
                                    mCache.put("id", "");
                                    mCache.put("sn", "");

                                    Log.e("-------", "");
                                    // 清空任务栈(TaskStack)
                                    Intent logoutIntent = new Intent
                                            (ProfileActivity.this, MainActivity.class);
                                    logoutIntent.setFlags(
                                            Intent.FLAG_ACTIVITY_CLEAR_TOP |
                                                    Intent.FLAG_ACTIVITY_SINGLE_TOP);
                                    logoutIntent.putExtra("outlogin", true);
                                    startActivity(logoutIntent);
                                    finish();
                                } else {
                                    Toast.makeText
                                            (ProfileActivity.this.getApplicationContext(), entity.getMsg(),
                                                    Toast.LENGTH_SHORT)
                                            .show();
                                }
                            }
                        });
                break;
        }
    }

    // 传统的设置头像的方法
    private void ShowPickDialog() {
        new AlertDialog.Builder(this).setTitle("设置头像").setNegativeButton("相册", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                try {
                    Intent intent2 = new Intent(Intent.ACTION_GET_CONTENT, null);
                    intent2.setType("image/*");
                    startActivityForResult(intent2, PHOTO_ALBUM);
                } catch (ActivityNotFoundException e) {
                    Toast.makeText(ProfileActivity.this.getApplicationContext(), "没有找到相册!", Toast.LENGTH_SHORT).show();
                }
            }
        }).setPositiveButton("拍照", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                dialog.dismiss();
                File file = new File(PHOTO_DIR, "temp.png");
                if (file.exists()) {
                    file.delete();
                }
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(PHOTO_DIR, "temp.png")));
                try {
                    startActivityForResult(intent, PHOTO_CAMERA);
                } catch (Exception e) {
                    Toast.makeText(ProfileActivity.this.getApplicationContext(), "请打开相机权限!", Toast.LENGTH_SHORT).show();
                }
            }
        }).show();
    }

    /**
     * 调用系统图片编辑进行裁剪
     */
    private void startPhotoCrop(Uri uri) {
        mFileName = System.currentTimeMillis() + ".png";
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);
        uploadFilePath = photoPath + mFileName;
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(photoPath, mFileName)));
        intent.putExtra("return-data", false);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, PHOTO_RESULT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            // 如果是直接从相册获取
            case PHOTO_ALBUM:
                // 调用系统剪裁
                if (data != null) {
                    startPhotoCrop(data.getData());
                }

                break;
            // 如果是调用相机拍照时
            case PHOTO_CAMERA:
                // 调用系统剪裁
                startPhotoCrop(Uri.fromFile(new File(photoPath, "temp.png")));
                break;
            // 取得裁剪后的图片
            case PHOTO_RESULT:
                //图片保存路径加命名
                file = new File(photoPath + mFileName);
                if (file.exists()) {
                    beginupload();
                }
                break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    public void beginupload() {
        showLoading("数据请求中...");
        // 构造上传请求
        PutObjectRequest put = new PutObjectRequest(testBucket, "appdata/" + uploadObject + ".png", uploadFilePath);

        // 异步上传时可以设置进度回调
        put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
            @Override
            public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                Log.e("----11-----", "");
                Log.e("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
            }
        });

        OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
            @Override
            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                Log.e("PutObject", "UploadSuccess");
                Log.e("ETag", result.getETag());
                Log.e("RequestId", result.getRequestId());
                begindownload();

            }

            @Override
            public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                dissmissLoading();
                // 请求异常
                if (clientExcepion != null) {
                    // 本地异常如网络异常等
                    clientExcepion.printStackTrace();
                }
                if (serviceException != null) {
                    // 服务异常
                    Log.e("ErrorCode", serviceException.getErrorCode());
                    Log.e("RequestId", serviceException.getRequestId());
                    Log.e("HostId", serviceException.getHostId());
                    Log.e("RawMessage", serviceException.getRawMessage());
                }
            }
        });

    }

    private void begindownload() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                str = oss.presignPublicObjectURL(testBucket, "appdata/" + uploadObject + ".png");
                Log.e("=========aaa=======", "" + str);
                RequestParams params = new RequestParams(HttpConfig.WIP + "appmember/member/img");
                params.addBodyParameter("id", uploadObject);
                params.addBodyParameter("img", str);
                params.addBodyParameter("spId", HttpConfig.SPID);
                x.http().post(params, new Callback.CommonCallback<String>() {
                    @Override
                    public void onSuccess(String result) {
                        dissmissLoading();
                        Log.e("----sssss----", "" + result);
                        Gson gson = new Gson();
                        BaseEntity baseEntity = gson.fromJson(result, BaseEntity.class);
                        int httpcode = baseEntity.getHttpCode();
                        if (httpcode == 200) {
                            getUserInforTask();
                            sendBroadcast();
                            Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
                        }

                    }

                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {
                        ex.printStackTrace();
                        dissmissLoading();
                        Toast.makeText(ProfileActivity.this.getApplicationContext(), "上传失败!", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onCancelled(CancelledException cex) {
                        dissmissLoading();
                    }

                    @Override
                    public void onFinished() {

                    }
                });
            }
        }).start();
    }

    void sendBroadcast() {
        //修改信息后发送广播
        Intent intent = new Intent();
        intent.setAction("com.znh.modifyUserInfor");
        sendBroadcast(intent);
    }
}`
别忘了在application中初始化图片的存储的路径
HttpConfig.PATH = FileUtils.getFilePath(getApplicationContext(), "/文件名/");   
/**
     * 本地缓存目录
     */
    public class HttpConfig {
    public static String PATH = "";  
    }

这里有一部分代码段是不需要的节约时间就全部粘贴进来了,上面有说明你只需要看的部分。

2.当然你必须先去看Tusdk的文档,这里使用TUsdk头像选择图库和拍照的时候就解决了上面出现的异常,代码块和上面的相同只是选择的渠道方式不同而已
这里就给些简单的TuSDK的代码块,你需要在平台申请应用并填写包名,必须打包相对应的应用下面的资源到你的目录中,这里只使用了TuSDK部分的功能。
新建TuSDK.bundle这里必须这样命名这是规范
并且要使用它给你的TusdkUIdefault作为module,这里看文档其实不难。
在application中初始化

//TUsdk
        TuSdk.enableDebugLog(true);
        // 开发ID (请前往 http://tusdk.com 获取您的 APP 开发秘钥)
        this.initPreLoader(this.getApplicationContext(), "你自己的");

代码块

    // 使用TUsdk设置头像的方法
    private void ShowPickDialog() {
        showSample(ProfileActivity.this);
    }

    /**
     * 显示范例
     */
    public void showSample(Activity activity) {
        if (activity == null)
            return;
        TuAvatarComponent component = TuSdkGeeV1.avatarCommponent(activity,
                new TuSdkComponent.TuSdkComponentDelegate() {
                    @Override
                    public void onComponentFinished(TuSdkResult arg0,
                                                    Error arg1, TuFragment arg2) {
                        //TODO 这里有三种方式选择图片 
                        //1.获取图片的 Bitmap 对象,此方式将不保存图片
                        //2.获取图片的存储路径,此方式会将图片保存在相册中(这里选择的是第二种会保存在相册中)
                        //3.将图片保存在临时文件中,并获取临时文件
                        uploadFilePath = arg0.imageSqlInfo.path;// 拿到图片路径

                        Log.e("图片的路径", uploadFilePath + "");
                        //图片保存路径加命名
                        file = new File(uploadFilePath + "");
                        if (file.exists()) {
                            beginupload();
                        }


                    }
                });
        component.componentOption().cameraOption()
                .setAvPostion(CameraConfigs.CameraFacing.Back);// 默认后置摄像头
        // 是否保存到相册
        component.componentOption().cameraOption().setSaveToAlbum(false);
        // 是否保存到临时文件
        component.componentOption().cameraOption().setSaveToTemp(true);
        component.componentOption().cameraOption().setSaveToAlbumName("Camera");
        // 需要显示的滤镜名称列表 (如果为空将显示所有自定义滤镜, 可选)
        String[] filters = {"SkinNature", "SkinPink", "SkinJelly", "SkinNoir",
                "SkinRuddy", "SkinPowder", "SkinSugar"};
        component.componentOption().cameraOption()
                .setFilterGroup(Arrays.asList(filters));
        component
                // 在组件执行完成后自动关闭组件
                .setAutoDismissWhenCompleted(true)
                // 显示组件
                .showComponent();
    }

这里的好处就是只需要调Tusdk的处理事件,其他的后续操作压缩和存储的路径之类的都不用自己写,比较方便同时也解决了上面的问题。
当然出现上面的问题的时候肯定有解决的方法,但是为了赶时间所以选择了Tusdk的方式解决了,希望大家给出的建议和问题的解决方式,Android 4.X部分手机会出现64K问题,按照tusdk处理就能解决。
本文章纯属个人观点,供参考和积累,希望有所帮助!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值