Retrofit 相机相册上传头像

本文介绍了一个用于Android应用中的用户头像上传与裁剪功能实现流程,包括使用不同方式选择图片、图片裁剪及最终上传至服务器的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口地址
https://www.zhaoapi.cn/file/upload  
参数
uid=用户id&file=文件
//上传头像
@Multipart
@POST(AppConstant.USER_UP_LOAD_PIC)
Call<UpLoadBean> upLoadPic(@Query("uid") String mobile, @Part MultipartBody.Part part);

//diaolog点击显示

final Dialog mdialog = new Dialog(getActivity(), R.style.my_dialog);
View dialog_view = LayoutInflater.from(MyApplication.getInstance()).inflate(R.layout.dialog_layout, null);
TextView xiangji = dialog_view.findViewById(R.id.xiangji);
TextView xiangce = dialog_view.findViewById(R.id.xiangce);
TextView quxiao = dialog_view.findViewById(R.id.quxiao);
//取消
quxiao.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mdialog.cancel();
    }
});
//相机
xiangji.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //打开相机 MediaStore.ACTION_IMAGE_CAPTURE 打开相机的Action
        Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //在Sdcard 中创建文件 存入图片
      String path = Environment.getExternalStorageDirectory() + "usericon.png";        it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path)));
        //1.意图   2.requestCode 请求码
        startActivityForResult(it, 1000);
        mdialog.cancel();
    }
});
//相册
xiangce.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //调取系统的相册  Intent.ACTION_PICK相册
        Intent it = new Intent(Intent.ACTION_PICK);
        //设置格式
        it.setType("image/*");
        startActivityForResult(it, 3000);
        mdialog.cancel();
    }
});
mdialog.setContentView(dialog_view);
mdialog.setTitle("修改用户头像");
Window window = mdialog.getWindow();
window.setGravity(Gravity.BOTTOM);
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.x = 0;
attributes.y = -20;
attributes.width = getResources().getDisplayMetrics().widthPixels;
dialog_view.measure(0, 0);
attributes.height = dialog_view.getMeasuredHeight();
attributes.alpha = 9f;
window.setAttributes(attributes);
mdialog.setCanceledOnTouchOutside(true);
mdialog.show();

//---------------------------------------------------

//activityresult 回调

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //当拍完照以后点击完成  会执行 onActivityResult 方法 调取裁剪功能
    String s = "";
    if (requestCode == 1000 && resultCode == RESULT_OK) {
        //调取裁剪功能  om.android.camera.action.CROP 裁剪的Action
        Intent it = new Intent("com.android.camera.action.CROP");
        //得到图片设置类型
        it.setDataAndType(Uri.fromFile(new File(path)), "image/*");
        //是否支持裁剪 设置 true 支持  false 不支持
        it.putExtra("CROP", true);
        //设置比例大小  1:1
        it.putExtra("aspectX", 1);
        it.putExtra("aspectY", 1);
        //输出的大小
        it.putExtra("outputX", 250);
        it.putExtra("outputY", 250);
        s = "相机";
        //将裁剪好的图片进行返回到Intent中
        it.putExtra("return-data", true);
        startActivityForResult(it, 2000);
    } else if (requestCode == 3000 && resultCode == RESULT_OK) {
        s = "相ce";
        //得到相册图片
        Uri uri = data.getData();
        //裁剪
        Intent it = new Intent("com.android.camera.action.CROP");
        //设置图片 以及格式
        it.setDataAndType(uri, "image/*");
        //是否支持裁剪
        it.putExtra("crop", true);
        //设置比例
        it.putExtra("aspectX", 1);
        it.putExtra("aspectY", 1);
        //设置输出的大小
        it.putExtra("outputX", 250);
        it.putExtra("outputY", 250);
        //是否支持人脸识别
        //           it.putExtra("onFaceDetection", true);
        //返回
        it.putExtra("return-data", true);
        startActivityForResult(it, 2000);

    }
    Log.i("xxx", "----1---" + s + "-------");
    //点击完裁剪的完成以后会执行的方法
    if (requestCode == 2000 && resultCode == RESULT_OK) {
        Bitmap bitmap = data.getParcelableExtra("data");
        //userIcon.setImageBitmap(bitmap);
        File resourceFile = getResourceFile(bitmap);
        RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), resourceFile);
        MultipartBody.Part part = MultipartBody.Part.createFormData("file", resourceFile.getName(), requestBody);
        SharedPreferences user = getActivity().getSharedPreferences("user", Context.MODE_PRIVATE);
        String uid = user.getString("uid", "");
        if (!uid.isEmpty() && !uid.equals("")) {
            presenter.getUpLoadData(uid, part);
        }
        Log.i("xxx", "----2---" + s + "-------");

    }
}

/-----------------------------------------------------

//生成图片file方法

private File getResourceFile(Bitmap bitmap) {
    File file = new File(getActivity().getFilesDir().getAbsolutePath());
    if (!file.exists()) {
        //如果file不存在 则创建此文件夹
        file.mkdirs();
    }
    //根据获取到的file文件夹 生成带根目录的图片文件
    File file1 = new File(file, "icon.png");
    try {
        FileOutputStream fileOutputStream = new FileOutputStream(file1);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
        //刷新流
        fileOutputStream.flush();
        //关流
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return file1;
}
内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值