文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android头像上传功能的实现代码(获取头像加剪切)

2023-05-30 21:43

关注

因为项目中需要用到头像上传的功能,所以就下个Ddmo先来实现下。

demo我是类似仿微信的,在一个GridView中展示所有的图片,其中第一个item可以去照相;获取到图片后再进行剪切。

图片的剪切是从网上找的感觉不错就用,暂时也没有测试。

获取图片可以用:https://github.com/lovetuzitong/MultiImageSelector来实现

这里的圆形图像是用https://github.com/hdodenhof/CircleImageView来实现的

Demo写的比较粗糙,效果只是在4.4的手机和7.0的模拟器跑了一遍,所以可能会出现问题的。

如下是demo的效果图:

Android头像上传功能的实现代码(获取头像加剪切)

Android头像上传功能的实现代码(获取头像加剪切)

如下是选择图片中的代码

通过LoaderManager来获取到所有的图片,然后第一个进行拍照的处理

package com.item.demo.photo.activity;import android.Manifest;import android.app.LoaderManager;import android.content.ContentResolver;import android.content.Context;import android.content.CursorLoader;import android.content.Intent;import android.content.Loader;import android.content.pm.PackageManager;import android.database.Cursor;import android.net.Uri;import android.os.Build;import android.os.Environment;import android.provider.MediaStore;import android.support.annotation.NonNull;import android.support.v4.content.ContextCompat;import android.support.v4.content.FileProvider;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.GridView;import android.widget.ImageView;import com.item.demo.photo.BuildConfig;import com.item.demo.photo.R;import com.item.demo.photo.adapter.MyPhotoAdapter;import com.item.demo.photo.uilts.Image;import java.io.File;import java.util.ArrayList;import java.util.List;public class MyPhotoActivity extends AppCompatActivity {  private static final int REQUEST_CAPTURE = 100;  //private static final int REQUEST_PICK = 101;  private static final int REQUEST_CROP_PHOTO = 102;  public static final int FINSH_RESULT = 104;//截图后的返回  private static final int LOADER_ID = 0x0100;  private LoadCallBack mLoad = new LoadCallBack();  private MyPhotoAdapter mAdapter;  private List<Image> images = new ArrayList<>();  //调用照相机返回图片文件  private File tempFile;  private static final int MIN_IMAGE_FILE_SIZE = 10 * 1024; // 最小的图片大小  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_my_photo);    GridView gv_photo = (GridView)findViewById(R.id.gv_photo);    ImageView img_back = (ImageView)findViewById(R.id.iv_back);    images.add(new Image());    mAdapter = new MyPhotoAdapter(this,images);    gv_photo.setAdapter(mAdapter);    gv_photo.setOnItemClickListener(new AdapterView.OnItemClickListener() {      @Override      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {        if(i == 0){          //第一个就去照相          if(hasPermission(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})){            gotoCamera();          }else {            requestPermission(0x02,new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE});          }        }else {          //这里点击获取到图片地址然后裁剪          gotoClipActivity(Uri.parse(images.get(i).getPath()));        }      }    });    img_back.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        finish();      }    });  }  @Override  protected void onStart() {    super.onStart();    if(hasPermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE})){      getLoaderManager().initLoader(LOADER_ID,null,mLoad);    }else {      requestPermission(0x01,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE});    }  }  private class LoadCallBack implements LoaderManager.LoaderCallbacks<Cursor>{    private final String[] IMAGE_PROJECTION = new String[]{        MediaStore.Images.Media._ID,//Id        MediaStore.Images.Media.DATA,//图片路径        MediaStore.Images.Media.DATE_ADDED//图片的创建时间    };    @Override    public Loader<Cursor> onCreateLoader(int id, Bundle args) {      //创建一个Loader      if(id == LOADER_ID){        //如果是我们的ID则进行初始化        return new CursorLoader(getBaseContext(),            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,            IMAGE_PROJECTION,            null,            null,            IMAGE_PROJECTION[2] + " DESC");      }      return null;    }    @Override    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {      //当Loader加载完成时      List<Image> images = new ArrayList<>();      //判断是否有数据      if(data != null){        int count = data.getCount();        if(count > 0){          data.moveToFirst();          // 得到对应的列的Index坐标          int indexId = data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]);          int indexPath = data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]);          int indexDate = data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]);          do {            // 循环读取,直到没有下一条数据            int id = data.getInt(indexId);            String path = data.getString(indexPath);            long dateTime = data.getLong(indexDate);            File file = new File(path);            if (!file.exists() || file.length() < MIN_IMAGE_FILE_SIZE) {              // 如果没有图片,或者图片大小太小,则跳过              continue;            }            // 添加一条新的数据            Image image = new Image();            image.setId(id);            image.setPath(path);            image.setDate(dateTime);            images.add(image);          } while (data.moveToNext());        }      }      updateSource(images);    }    @Override    public void onLoaderReset(Loader<Cursor> loader) {      updateSource(null);    }  }    private void updateSource(List<Image> images){    this.images.clear();    this.images.add(new Image());    if(images == null || images.size() == 0) return;    this.images.addAll(images);    mAdapter.notifyDataSetChanged();  }    @Override  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    switch(requestCode){      case 0x02:        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){          gotoCamera();        }        break;      case 0x01:        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){          getLoaderManager().initLoader(LOADER_ID,null,mLoad);        }    }  }  @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    switch (requestCode){      case REQUEST_CAPTURE://系统相机返回        if(resultCode == RESULT_OK){          Log.d("jiejie","--------相机---------" + Uri.fromFile(tempFile).toString());          Log.d("jiejie","--------path----------" + getRealFilePathFromUri(MyPhotoActivity.this,Uri.fromFile(tempFile)));          gotoClipActivity(Uri.fromFile(tempFile));        }        break;      case REQUEST_CROP_PHOTO:        if(resultCode == RESULT_OK){          if(data != null){            Uri uri = data.getData();            Log.d("jiejie","-------------" + data.getData().getPath());            String cropImagePath = getRealFilePathFromUri(MyPhotoActivity.this,uri);            Log.d("jiejie","------crop--------" + cropImagePath);            Intent intent = new Intent();            intent.putExtra("image",cropImagePath);            setResult(FINSH_RESULT,intent);            MyPhotoActivity.this.finish();          }        }        break;    }  }    private void gotoCamera(){    String SDState = Environment.getExternalStorageState();    //判断SD卡是否存在    if(SDState.equals(Environment.MEDIA_MOUNTED)){      tempFile = new File(checkDirPath(Environment.getExternalStorageDirectory().getPath()+ "/image/"), System.currentTimeMillis() + ".jpg");      //隐式的打开调用系统相册      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){        intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);        //如果是7.0及以上的系统使用FileProvider的方式创建一个Uri        Uri contentUri = FileProvider.getUriForFile(MyPhotoActivity.this, BuildConfig.APPLICATION_ID + ".fileProvider", tempFile);        intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);      }else {        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));      }      startActivityForResult(intent,REQUEST_CAPTURE);    }  }    private void gotoClipActivity(Uri uri){    if(uri == null){      return;    }    Intent intent = new Intent(this,ClipImageActivity.class);    intent.putExtra("type",1);    intent.setData(uri);    startActivityForResult(intent,REQUEST_CROP_PHOTO);  }    private static String checkDirPath(String dirPath) {    if (TextUtils.isEmpty(dirPath)) {      return "";    }    File dir = new File(dirPath);    if (!dir.exists()) {      dir.mkdirs();    }    return dirPath;  }    public boolean hasPermission(String... permissions) {    for (String permisson : permissions) {      if (ContextCompat.checkSelfPermission(this, permisson)          != PackageManager.PERMISSION_GRANTED) {        return false;      }    }    return true;  }    public void requestPermission(int code, String... permissions) {    if (Build.VERSION.SDK_INT >= 23) {      requestPermissions(permissions, code);    }  }    public static String getRealFilePathFromUri(final Context context, final Uri uri) {    if (null == uri) return null;    final String scheme = uri.getScheme();    String data = null;    if (scheme == null)      data = uri.getPath();    else if (ContentResolver.SCHEME_FILE.equals(scheme)) {      data = uri.getPath();    } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {      Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);      if (null != cursor) {        if (cursor.moveToFirst()) {          int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);          if (index > -1) {            data = cursor.getString(index);          }        }        cursor.close();      }    }    return data;  }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯