1、实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,在本地sd卡存一份(如果有的话,没有则内部存储,所以还
需要判断用户是否挂载了sd卡),然后在服务器上存储一份该,当下次再次启动应用时,会默认去sd卡加载该,如果本地没有,再会去联网请求
2、使用了picasso框架以及自定义BitmapUtils工具类
3、记得加上相关权限
<uses-permission android:name="androidpermissionINTERNET"></uses-permission>
<uses-permission android:name="androidpermissionCAMERA"/>
<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE"></uses-permission>
/
public class MainActivity extends AppCompatActivity implements ViewOnClickListener {
private ImageView iv;//要设置的头像
private Button btn_photo;//调用相册按钮
private Button btn_camera;//调用相机按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
iv=(ImageView) findViewById(Ridiv);
btn_photo = (Button) findViewById(Ridbtn_photo);
btn_camera = (Button) findViewById(Ridbtn_camera);
btn_photosetOnClickListener(this);
btn_camerasetOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (vgetId()) {
case Ridbtn_photo://打开系统相册
Intent intent=new Intent(IntentACTION_PICK, MediaStoreImagesMediaEXTERNAL_CONTENT_URI);
startActivityForResult(intent,100);
break;
case Ridbtn_camera://打开系统相机
Intent intent2=new Intent(MediaStoreACTION_IMAGE_CAPTURE);
startActivityForResult(intent2,200);
break;
}
}
@RequiresApi(api = BuildVERSION_CODESKITKAT)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
superonActivityResult(requestCode, resultCode, data);
if(requestCode==100&&resultCode==RESULT_OK&&data!=null){//系统相册
Uri imageData = datagetData();
String path=getPath(imageData);
Bitmap bitmap = BitmapFactorydecodeFile(path);
Bitmap bitmap1 = BitmapUtilszoom(bitmap, ivgetWidth(), ivgetHeight());
Bitmap bitmap2 = BitmapUtilscircleBitmap(bitmap1);
//加载显示
ivsetImageBitmap(bitmap2);
//bitmap上传到服务器
//bitmap保存到本地
saveImage(bitmap2);
}else if(requestCode==200&&resultCode==RESULT_OK&&data!=null){//系统相机
Bitmap bitmap = (Bitmap) datagetExtras()get("data");
BitmapUtilszoom(bitmap,ivgetWidth(),ivgetHeight());
bitmap=BitmapUtilscircleBitmap(bitmap);
//加载显示
ivsetImageBitmap(bitmap);
//bitmap上传到服务器
//bitmap保存到本地
saveImage(bitmap);
}
}
/
数据的存储。(5种)
Bimap:内存层面的对象。
存储--->内存:
BitmapFactorydecodeFile(String filePath);
BitmapFactorydecodeStream(InputStream is);
内存--->存储:
bitmapcompress(BitmapCompressFormatPNG,100,OutputStream os);
/
private void saveImage(Bitmap bitmap) {
File filesDir;
if(EnvironmentgetExternalStorageState()equals(EnvironmentMEDIA_MOUNTED)){//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir = thisgetExternalFilesDir("");
}else{//手机内部存储
//路径:data/data/包名/files
filesDir = thisgetFilesDir();
}
FileOutputStream fos = null;
try {
File file = new File(filesDir,"iconpng");
fos = new FileOutputStream(file);
bitmapcompress(BitmapCompressFormatPNG, 100,fos);
} catch (FileNotFoundException e) {
eprintStackTrace();
}finally{
if(fos != null){
try {
fosclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
//如果本地有,就不需要再去联网去请求
private boolean readImage() {
File filesDir;
if(EnvironmentgetExternalStorageState()equals(EnvironmentMEDIA_MOUNTED)){//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir = getExternalFilesDir("");
}else{//手机内部存储
//路径:data/data/包名/files
filesDir = getFilesDir();
}
File file = new File(filesDir,"iconpng");
if(fileexists()){
//存储--->内存
Bitmap bitmap = BitmapFactorydecodeFile(filegetAbsolutePath());
ivsetImageBitmap(bitmap);
return true;
}
return false;
}
@RequiresApi(api = BuildVERSION_CODESKITKAT)
private String getPath(Uri uri) {
int sdkVersion = BuildVERSIONSDK_INT;
//高于442的版本
if (sdkVersion >= 19) {
Loge("TAG", "uri auth: " + urigetAuthority());
if (isExternalStorageDocument(uri)) {
String docId = DocumentsContractgetDocumentId(uri);
String[] split = docIdsplit(":");
String type = split[0];
if ("primary"equalsIgnoreCase(type)) {
return EnvironmentgetExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContractgetDocumentId(uri);
final Uri contentUri = ContentUriswithAppendedId(Uriparse("content://downloads/public_downloads"),
LongvalueOf(id));
return getDataColumn(this, contentUri, null, null);
} else if (isMediaDocument(uri)) {
final String docId = DocumentsContractgetDocumentId(uri);
final String[] split = docIdsplit(":");
final String type = split[0];
Uri contentUri = null;
if ("image"equals(type)) {
contentUri = MediaStoreImagesMediaEXTERNAL_CONTENT_URI;
} else if ("video"equals(type)) {
contentUri = MediaStoreVideoMediaEXTERNAL_CONTENT_URI;
} else if ("audio"equals(type)) {
contentUri = MediaStoreAudioMediaEXTERNAL_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 = {MediaStoreImagesMediaDATA};
Cursor actualimagecursor = thismanagedQuery(uri, proj, null, null, null);
int actual_image_column_index = actualimagecursorgetColumnIndexOrThrow(MediaStoreImagesMediaDATA);
actualimagecursormoveToFirst();
return actualimagecursorgetString(actual_image_column_index);
}
} else if ("content"equalsIgnoreCase(urigetScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return urigetLastPathSegment();
return getDataColumn(this, uri, null, null);
}
// File
else if ("file"equalsIgnoreCase(urigetScheme())) {
return urigetPath();
}
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 = contextgetContentResolver()query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursormoveToFirst()) {
final int index = cursorgetColumnIndexOrThrow(column);
return cursorgetString(index);
}
} finally {
if (cursor != null)
cursorclose();
}
return null;
}
private boolean isExternalStorageDocument(Uri uri) {
return "comandroidexternalstoragedocuments"equals(urigetAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "comandroidprovidersdownloadsdocuments"equals(urigetAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "comandroidprovidersmediadocuments"equals(urigetAuthority());
}
public static boolean isMedia(Uri uri) {
return "media"equals(urigetAuthority());
}
/
@param uri The Uri to check
@return Whether the Uri authority is Google Photos
/
public static boolean isGooglePhotosUri(Uri uri) {
return "comgoogleandroidappsphotoscontent"equals(urigetAuthority());
}
/
判断本地是否有该,没有则去联网请求
/
@Override
protected void onResume() {
superonResume();
if(readImage()){
return;
}
}
}
//BitmapUtils工具类public class BitmapUtils { /
该方法用于将进行圆形处理
/ public static Bitmap circleBitmap(Bitmap source){ //默认只对宽进行处理 int width=sourcegetWidth(); Bitmap bitmap=BitmapcreateBitmap(width,width,BitmapConfigARGB_8888); Canvas canvas=new Canvas(bitmap); Paint paint=new Paint(); //设置抗锯齿 paintsetAntiAlias(true); canvasdrawCircle(width/2,width/2,width/2,paint); paintsetXfermode(new PorterDuffXfermode(PorterDuffModeSRC_IN)); canvasdrawBitmap(source,0,0,paint); return bitmap; } / 该方法用于压缩处理,注意width、height参数的类型必须是float / public static Bitmap zoom(Bitmap source,float width,float height){ Matrix matrix=new Matrix(); //进行压缩处理 matrixpostScale(width/sourcegetWidth(),height/sourcegetHeight()); Bitmap bitmap = BitmapcreateBitmap(source, 0, 0, sourcegetWidth(), sourcegetHeight(), matrix, false); return bitmap; }}
以上所述是小编给大家介绍的Android实现调用系统图库与相机设置头像并保存在本地及服务器 ,希望对大家有所帮助
应用保存的在相册不显示:
1、刚刚下载的,媒体库扫描需要一定时间,建议等待一段时间进行查看。
2、如果下载的是照片,照片会根据拍照时间进行排序,建议查看其它时间轴能否显示。
3、进入「“相册”APP>图集」,在“最近删除”或者其他图集能否找到,如在不常用图集可以找到可将这个图集设为常用图集。
4、进入“文件管理”APP,查看分类或根据应用下载路径查查看是否显示,如正常显示建议清除相册数据后重新打开相册应用查看(此 *** 作不会删除)。
5、确认应用“读取、写入或删除存储空间”权限是否设置为“允许”。
6、重启手机后重新进入相册应用进行查看是否恢复。
通过以上排查若问题仍无法解决,建议前往当地OPPO官方服务中心详细检测处理。
三方应用在“文件管理”APP文件存储路径:
1、打开“文件管理”APP。
(1)、视频、音频、文档、安装包、压缩包有单独的入口,可进入查看有无对应文件。
(2)目前微信、QQ有专门的入口,可点击进入查看。
(3)若都无显示,可点击进入手机存储查看。
2、注意事项:
Android11系统进入「“文件管理”APP>手机存储>Android>data」目录下无显示,但可通过页面“”进一步查看,需要重新进入Android/data目录,点击右上角可更换显示方式,能够看到文件完整的名称。
部分三方应用的文件存储路径如下:
序号
应用名称 存储路径
1
微信 照片和视频:「“文件管理”APP>手机存储>Pictures>Weixin」。
文档:「“文件管理”APP>手机存储>Android>data>comtencent(mm)>(MicroMsg)>(Download)」。
2
QQ 照片、视频(手动下载时):「“文件管理”APP>手机存储>Tencent>QQ_lmages」和「“文件管理”APP>手机存储>Pictures>QQ」。
文档、视频(非手动下载时):「“文件管理”APP>手机存储>Android>data>comtencentmobileqq>Tencent>QQfile_recv」。
3
QQ浏览器 「“文件管理”APP>手机存储>QQBrowser」。
4
迅雷 「“文件管理”APP>手机存储>Android>data>comxunleidownloadprovider>files>ThunderDownload」。
5
腾讯视频 「“文件管理”APP>手机存储>Android>data>comtencentqqlive>files>video_xxx」。(腾讯视频做过相关处理,无法直接播放。)
6
爱奇艺视频 「“文件管理”APP>手机存储>Android>data>comqiyivideo>files>app>download>video>qsv后缀(MB/GB为单位的文件)」。(爱奇艺做过相关处理,无法直接播放。)
7
抖音 已下载视频保存在相册:「“文件管理”APP>手机存储>DCIM>Camera」。
8
快手 已下载视频保存在相册:「“文件管理”APP>手机存储>DCIM>Camera」。
9
淘宝 保存的:「“文件管理”APP>手机存储>Pictures>taobao」。
10
唱吧 「“文件管理”APP>手机存储>ktv>song」或「“文件管理”APP>手机存储>ktv>record」。
11
全民K歌 「“文件管理”APP>手机存储>Android>data>comtencentkaraoke>files>localsong」。
12
喜马拉雅 进入「“喜马拉雅”APP>右下角我的>右上角设置>下载和缓存设置>下载位置」。
默认:「“文件管理”APP>手机存储>Android>data>comximalayatingandroid>files>download」。
13
懒人听书 进入「“懒人畅听”APP>右下角账号>左上角设置>下载设置>下载目录设置」。
默认:「“文件管理”APP>手机存储>tingshu」。
温馨提示:
①若您提及应用不在以上范围,可自行搜索存储路径。
②若您手动点击保存文件,该文件会存储在系统目录下(比如使用微信、QQ时,手动保存或视频,会存储在/Pictures目录下);其他类似缓存或三方应用自发行为,文件会存储在/Android/data目录下。
1、首先要开启app对相册获取的权限,找到app对应的Infoplist文件,在Key值一栏填入:Privacy - Photo Library Usage Description,然后在Value一栏填入“此App需要您的同意才能读取相册”。
这样,再用户同意之后,我们的app就能拿到对相册访问的权限了。
2、找到对应控制器的m文件,在文件中创建一个全局的UIImagePickerController对象和一个UIImageView对象,我的是在ViewControllerm文件中创建的。
3初始化刚才添加imageView和imagePickerVC,初始化时,同时设置imagePickerVC的delegate和是否允许编辑,我习惯在懒加载中初始化
记得在@interface添加遵循的协议
4在viewDidLoad方法中初始化一个button,同时将刚才的imageView和button一起添加到selfview中
5添加button点击时触发的方法
6设置UIimagePickerController的代理方法,用来获取我们打开相册后选择的
这样,就能打开系统的相册了
下面是效果图:
以上就是关于安卓从手机相册获取照片作为头像缓存地址全部的内容,包括:安卓从手机相册获取照片作为头像缓存地址、opporeno6qq图片保存在系统相册在哪里、ios开发-调用系统相册(原生)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)