上传头像(本地上传和拍照)

首先点击图片

弹出对话框

 

点击本地图片选中 截取

 

点击拍照,截取

 

-------------------------权限

 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

之后是

-----------------------------------btn_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_pai"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="拍照"
        />
    <Button
        android:id="@+id/btn_xiangce"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="上传本地"
        />

</LinearLayout>

 

-------------------------------这个是main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    >

<TextView
    android:text="头像"
    android:textSize="20sp"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/img_view"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="center"
        android:src="@mipmap/ic_launcher"
        />

</LinearLayout>

-----------------------------最后主页面

import android.app.AlertDialog.Builder;
import android.app.AlertDialog;
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.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private ImageView img_view;
    private AlertDialog alertDialog;
    private Button btn_xiangce;
    private Button btn_pai;
    private String path = Environment.getExternalStorageDirectory() + "/head.jpg";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_view = findViewById(R.id.img_view);
        img_view.setOnClickListener(this);
    }
    

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.img_view:
                createDialog();
                break;
            case R.id.btn_pai:
                Intent PIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                PIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(new File(path)));
                startActivityForResult(PIntent, 100);
                alertDialog.dismiss();
                break;
            case R.id.btn_xiangce:
                Intent XIntent = new Intent(Intent.ACTION_PICK);
                XIntent.setType("image/*");
                startActivityForResult(XIntent, 99);
                alertDialog.dismiss();
                break;
            default:
                break;

        }
    }

    private void createDialog() {
        // TODO Auto-generated method stub
        Builder builder = new AlertDialog.Builder(this);
        alertDialog = builder.create();
        alertDialog.setTitle("请选择");
        View dialogView = View.inflate(this, R.layout.btn_layout,
                null);
        alertDialog.setView(dialogView);
        btn_xiangce = (Button) dialogView.findViewById(R.id.btn_xiangce);
        btn_pai = (Button) dialogView.findViewById(R.id.btn_pai);
        btn_xiangce.setOnClickListener(this);
        btn_pai.setOnClickListener(this);
        alertDialog.show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 99 && resultCode == this.RESULT_OK) {
            // 裁剪
            crop(data.getData());
        }
        if (requestCode == 89 && resultCode == this.RESULT_OK) {
            img_view.setImageBitmap((Bitmap) data.getParcelableExtra("data"));
        }
        if (requestCode == 100 && resultCode == this.RESULT_OK) {
            crop(Uri.fromFile(new File(path)));
        }
}

    private void crop(Uri data) {
        // TODO Auto-generated method stub
        Intent cIntent = new Intent("com.android.camera.action.CROP");
        cIntent.setDataAndType(data, "image/*");
        cIntent.putExtra("crop", "true");
        cIntent.putExtra("aspectX", 1);
        cIntent.putExtra("aspectY", 1);
        cIntent.putExtra("outputX", 249);
        cIntent.putExtra("outputY", 249);
        cIntent.putExtra("return-data", true);
        startActivityForResult(cIntent, 89);
    }
    }

在这里不要把包导错

import android.app.AlertDialog.Builder;

import android.app.AlertDialog;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android中,可以通过使用Retrofit等网络请求库来实现头像上传和下载,并将头像缓存到本地。以下是一个简单的示例: 1. 添加Retrofit和OkHttp依赖: ```gradle implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' ``` 2. 定义上传和下载接口: ```java public interface ApiService { @Multipart @POST("upload_avatar") Call<ResponseBody> uploadAvatar(@Part MultipartBody.Part file); @GET("download_avatar") Call<ResponseBody> downloadAvatar(); } ``` 在上述代码中,使用@Multipart注解标记上传的请求,@Part注解标记上传的文件。下载接口使用@GET注解标记,并返回一个ResponseBody对象。 3. 实现上传头像的逻辑: ```java // 选择图片并上传头像 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, 1); @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK && data != null) { Uri uri = data.getData(); File file = new File(getRealPathFromUri(this, uri)); RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file); MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), requestBody); ApiService apiService = createApiService(); Call<ResponseBody> call = apiService.uploadAvatar(filePart); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Toast.makeText(MainActivity.this, "上传失败", Toast.LENGTH_SHORT).show(); } }); } } // 获取URI对应的真实路径 public String getRealPathFromUri(Context context, Uri uri) { String[] projection = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); if (cursor != null && cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); String filePath = cursor.getString(columnIndex); cursor.close(); return filePath; } return ""; } ``` 在上述代码中,使用Intent.ACTION_GET_CONTENT打开文件选择器,选择图片后将图片文件构造成RequestBody和MultipartBody.Part对象,然后使用Retrofit上传头像。 4. 实现下载头像并缓存到本地的逻辑: ```java // 下载头像并缓存到本地 ApiService apiService = createApiService(); Call<ResponseBody> call = apiService.downloadAvatar(); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { if (response.isSuccessful()) { try (InputStream inputStream = response.body().byteStream()) { Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imageView.setImageBitmap(bitmap); // 将头像保存到本地文件 File file = new File(getCacheDir(), "avatar.png"); try (FileOutputStream fos = new FileOutputStream(file)) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); } catch (IOException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); } }); ``` 在上述代码中,使用Retrofit下载头像,如果下载成功,将头像设置到ImageView中,并将头像保存到本地文件中。需要注意的是,下载头像时需要在异步线程中执行,否则会抛出NetworkOnMainThreadException异常。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值