Android实现调用系统图库与相机设置头像并保存在本地及服务器
发布时间 - 2026-01-10 23:26:49 点击率:次废话不多说了,直接给大家贴代码了,具体代码如下所述:
/**
* 1、实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还
* 需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求
* 2、使用了picasso框架以及自定义BitmapUtils工具类
* 3、记得加上相关权限
* <uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
* */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView iv;//要设置的头像
private Button btn_photo;//调用相册按钮
private Button btn_camera;//调用相机按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=(ImageView) findViewById(R.id.iv);
btn_photo = (Button) findViewById(R.id.btn_photo);
btn_camera = (Button) findViewById(R.id.btn_camera);
btn_photo.setOnClickListener(this);
btn_camera.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_photo://打开系统相册
Intent intent=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent,100);
break;
case R.id.btn_camera://打开系统相机
Intent intent2=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent2,200);
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==100&&resultCode==RESULT_OK&&data!=null){//系统相册
Uri imageData = data.getData();
String path=getPath(imageData);
Bitmap bitmap = BitmapFactory.decodeFile(path);
Bitmap bitmap1 = BitmapUtils.zoom(bitmap, iv.getWidth(), iv.getHeight());
Bitmap bitmap2 = BitmapUtils.circleBitmap(bitmap1);
//加载显示
iv.setImageBitmap(bitmap2);
//bitmap图片上传到服务器......
//bitmap图片保存到本地
saveImage(bitmap2);
}else if(requestCode==200&&resultCode==RESULT_OK&&data!=null){//系统相机
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
BitmapUtils.zoom(bitmap,iv.getWidth(),iv.getHeight());
bitmap=BitmapUtils.circleBitmap(bitmap);
//加载显示
iv.setImageBitmap(bitmap);
//bitmap图片上传到服务器......
//bitmap图片保存到本地
saveImage(bitmap);
}
}
/**
* 数据的存储。(5种)
* Bimap:内存层面的图片对象。
*
* 存储--->内存:
* BitmapFactory.decodeFile(String filePath);
* BitmapFactory.decodeStream(InputStream is);
* 内存--->存储:
* bitmap.compress(Bitmap.CompressFormat.PNG,100,OutputStream os);
*/
private void saveImage(Bitmap bitmap) {
File filesDir;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir = this.getExternalFilesDir("");
}else{//手机内部存储
//路径:data/data/包名/files
filesDir = this.getFilesDir();
}
FileOutputStream fos = null;
try {
File file = new File(filesDir,"icon.png");
fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//如果本地有,就不需要再去联网去请求
private boolean readImage() {
File filesDir;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir = getExternalFilesDir("");
}else{//手机内部存储
//路径:data/data/包名/files
filesDir = getFilesDir();
}
File file = new File(filesDir,"icon.png");
if(file.exists()){
//存储--->内存
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
iv.setImageBitmap(bitmap);
return true;
}
return false;
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private String getPath(Uri uri) {
int sdkVersion = Build.VERSION.SDK_INT;
//高于4.4.2的版本
if (sdkVersion >= 19) {
Log.e("TAG", "uri auth: " + uri.getAuthority());
if (isExternalStorageDocument(uri)) {
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split(":");
String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(this, contentUri, null, null);
} else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{split[1]};
return getDataColumn(this, contentUri, selection, selectionArgs);
} else if (isMedia(uri)) {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor actualimagecursor = this.managedQuery(uri, proj, null, null, null);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
return actualimagecursor.getString(actual_image_column_index);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(this, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* uri路径查询字段
*
* @param context
* @param uri
* @param selection
* @param selectionArgs
* @return
*/
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
private boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
public static boolean isMedia(Uri uri) {
return "media".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
/**
* 判断本地是否有该图片,没有则去联网请求
* */
@Override
protected void onResume() {
super.onResume();
if(readImage()){
return;
}
}
}
//BitmapUtils工具类public class BitmapUtils { /**
* 该方法用于将图片进行圆形处理
* */ public static Bitmap circleBitmap(Bitmap source){ //默认只对宽进行处理 int width=source.getWidth(); Bitmap bitmap=Bitmap.createBitmap(width,width,Bitmap.Config.ARGB_8888); Canvas canvas=new Canvas(bitmap); Paint paint=new Paint(); //设置抗锯齿 paint.setAntiAlias(true); canvas.drawCircle(width/2,width/2,width/2,paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(source,0,0,paint); return bitmap; } /** * 该方法用于图片压缩处理,注意width、height参数的类型必须是float * */ public static Bitmap zoom(Bitmap source,float width,float height){ Matrix matrix=new Matrix(); //图片进行压缩处理 matrix.postScale(width/source.getWidth(),height/source.getHeight()); Bitmap bitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, false); return bitmap; }}
以上所述是小编给大家介绍的Android实现调用系统图库与相机设置头像并保存在本地及服务器 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
# android
# 调用系统图库
# Android 系统服务TelecomService启动过程原理分析
# Android 添加系统服务的方法详解
# Android中获得正在运行的程序和系统服务的方法
# 往Android系统中添加服务的方法教程
# Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法
# Ubuntu中为Android系统实现内置Java应用程序测试Application Framewo
# Android编程获取系统隐藏服务实现锁屏的方法
# Android系统服务是如何获取的
# 给大家
# 加载
# 所述
# 小编
# 图片上传
# 就不
# 说了
# 不多
# 自定义
# 再去
# 只对
# 给我留言
# 并保存
# 有任何
# 器上
# 下次
# 使用了
# 抗锯齿
# imageData
# RESULT_OK
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel集合Collection怎么用_Laravel集合常用函数详解
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
如何在香港服务器上快速搭建免备案网站?
C#如何调用原生C++ COM对象详解
如何用景安虚拟主机手机版绑定域名建站?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
C语言设计一个闪闪的圣诞树
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何在IIS中新建站点并解决端口绑定冲突?
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel如何发送系统通知?(Notification渠道示例)
深圳网站制作平台,深圳市做网站好的公司有哪些?
Laravel怎么判断请求类型_Laravel Request isMethod用法
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
网页设计与网站制作内容,怎样注册网站?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel如何与Inertia.js和Vue/React构建现代单页应用
非常酷的网站设计制作软件,酷培ai教育官方网站?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
如何快速配置高效服务器建站软件?
如何在Tomcat中配置并部署网站项目?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Android自定义控件实现温度旋转按钮效果
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
焦点电影公司作品,电影焦点结局是什么?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
什么是javascript作用域_全局和局部作用域有什么区别?
如何在万网利用已有域名快速建站?
IOS倒计时设置UIButton标题title的抖动问题
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
智能起名网站制作软件有哪些,制作logo的软件?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
js代码实现下拉菜单【推荐】
个人网站制作流程图片大全,个人网站如何注销?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
如何利用DOS批处理实现定时关机操作详解
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何在 React 中条件性地遍历数组并渲染元素
如何用PHP工具快速搭建高效网站?

