废话不多说了,直接给大家贴代码了,具体代码如下所述:
/**
* 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
相关文章:
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
头像制作网站在线制作软件,dw网页背景图像怎么设置?
教学网站制作软件,学习*后期制作的网站有哪些?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
广州建站公司哪家好?十大优质服务商推荐
建站为何优先选择香港服务器?
如何高效利用亚马逊云主机搭建企业网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
动图在线制作网站有哪些,滑动动图图集怎么做?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
如何在景安云服务器上绑定域名并配置虚拟主机?
广州商城建站系统开发成本与周期如何控制?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
网站制作服务平台,有什么网站可以发布本地服务信息?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站之星北京办公室:智能建站系统与小程序生成方案解析
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
安云自助建站系统如何快速提升SEO排名?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
宝塔新建站点报错如何解决?
学校建站服务器如何选型才能满足性能需求?
如何在Golang中指定模块版本_使用go.mod控制版本号
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何通过PHP快速构建高效问答网站功能?
PHP 500报错的快速解决方法
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何基于云服务器快速搭建个人网站?
如何安全更换建站之星模板并保留数据?
如何使用Golang安装API文档生成工具_快速生成接口文档
h5网站制作工具有哪些,h5页面制作工具有哪些?
,想在网上投简历,哪几个网站比较好?
如何在IIS中新建站点并解决端口绑定冲突?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何用AWS免费套餐快速搭建高效网站?
建站之星多图banner生成与模板自定义指南
如何快速搭建支持数据库操作的智能建站平台?
python的本地网站制作,如何创建本地站点?
已有域名和空间如何搭建网站?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
小程序网站制作需要准备什么资料,如何制作小程序?
网站制作公司排行榜,抖音怎样做个人官方网站
北京企业网站设计制作公司,北京铁路集团官方网站?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
如何通过免费商城建站系统源码自定义网站主题与功能?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
c++怎么用jemalloc c++替换默认内存分配器【性能】
建站之星代理费用多少?最新价格详情介绍
*请认真填写需求信息,我们会在24小时内与您取得联系。