Xamarin.Android 调用本地相册
调用本地相册选中照片在ImageView上显示
代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Android.Provider; using Android.Database; using System.Threading; using Java.IO; namespace CallLocalPhoto { [Activity(Label = "CallLocalPhoto", MainLauncher = true)] public class MainActivity : Activity { Button btn; ImageView iv; private Java.IO.File originalFile; private const int PhotoGallery_RequestCode = 1; //设置返回代码Code,可自行定义 protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); originalFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory( Android.OS.Environment.DirectoryPictures ), "zcb_pic_" + SystemClock.CurrentThreadTimeMillis() + ".png"); btn = FindViewById<Button>(Resource.Id.button1); iv = FindViewById<ImageView>(Resource.Id.imageView1); btn.Click += Btn_Click; } private void Btn_Click(object sender, EventArgs e) { CutImageByImgStore(); } /// <summary> /// 调用相册选择 /// </summary> private void CutImageByImgStore() { Intent _intentCut = new Intent(Intent.ActionGetContent, null); _intentCut.SetType("image/*");// 设置文件类型 _intentCut.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(originalFile)); _intentCut.PutExtra(MediaStore.ExtraVideoQuality, 1); StartActivityForResult(_intentCut, PhotoGallery_RequestCode); } /// <summary> /// 选择图片后返回 /// </summary> /// <param name="requestCode"></param> /// <param name="ResultStatus"></param> /// <param name="data"></param> protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result ResultStatus, Intent data) { if (ResultStatus == Result.Ok) { /* * 若系统版本低于4.4,返回原uri * 若高于4.4,解析uri后返回 * */ if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat) { var url = Android.Net.Uri.Parse("file://" + GetPath(BaseContext, data.Data)); data.SetData(url); //将本地相册照片显示在控件上 iv.SetImageURI(Android.Net.Uri.FromFile(new File(GetPath(BaseContext, data.Data)))); } } } #region 高于 v4.4 版本 解析真实路径 public static String GetPath(Context context, Android.Net.Uri uri) { bool isKitKat = Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat; // DocumentProvider if (isKitKat && DocumentsContract.IsDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { String docId = DocumentsContract.GetDocumentId(uri); String[] split = docId.Split(':'); String type = split[0]; if ("primary".Equals(type.ToLower())) { return Android.OS.Environment.ExternalStorageDirectory + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { String id = DocumentsContract.GetDocumentId(uri); Android.Net.Uri contentUri = ContentUris.WithAppendedId( Android.Net.Uri.Parse("content://downloads/public_downloads"), long.Parse(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { String docId = DocumentsContract.GetDocumentId(uri); String[] split = docId.Split(':'); String type = split[0]; Android.Net.Uri contentUri = null; if ("image".Equals(type)) { contentUri = MediaStore.Images.Media.ExternalContentUri; } else if ("video".Equals(type)) { contentUri = MediaStore.Video.Media.ExternalContentUri; } else if ("audio".Equals(type)) { contentUri = MediaStore.Audio.Media.ExternalContentUri; } String selection = "_id=?"; String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".Equals(uri.Scheme.ToLower())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.LastPathSegment; return getDataColumn(context, uri, null, null); } // File else if ("file".Equals(uri.Scheme.ToLower())) { return uri.Path; } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Android.Net.Uri uri, String selection, String[] selectionArgs) { ICursor cursor = null; String column = "_data"; String[] projection = { column }; try { cursor = context.ContentResolver.Query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.MoveToFirst()) { int index = cursor.GetColumnIndexOrThrow(column); return cursor.GetString(index); } } finally { if (cursor != null) cursor.Close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static bool isExternalStorageDocument(Android.Net.Uri uri) { return "com.android.externalstorage.documents".Equals(uri.Authority); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static bool isDownloadsDocument(Android.Net.Uri uri) { return "com.android.providers.downloads.documents".Equals(uri.Authority); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static bool isMediaDocument(Android.Net.Uri uri) { return "com.android.providers.media.documents".Equals(uri.Authority); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static bool isGooglePhotosUri(Android.Net.Uri uri) { return "com.google.android.apps.photos.content".Equals(uri.Authority); } #endregion } }
下载地址:
链接: https://pan.baidu.com/s/1Yhlv2oHsAH-9Hs8WolX7Lw
密码: h6g7

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Xamarin.Android 调用手机拍照功能
最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-->判断是否具备拍照功能-->创建图片目录(文件夹)-->点击拍照事件-->返回图片并绑定在控件上显示。 引用命名空间: using System; using System.Collections.Generic; using Android.App; using Android.Content; using Android.Content.PM; using Android.Graphics; using Android.OS; using Android.Provider; using Android.Widget; using Java.IO; using Environment = Android.OS.Environment; using Uri = Android.Net.Uri; 加载: protected override void OnCreat...
- 下一篇
探索Android路由框架-ARouter之深挖源码(二)
本文已独家授权 郭霖 ( guolin_blog) 公众号发布! 在《探索Android路由框架-ARouter(一)》中,主要介绍了ARouter框架的基本配置、多种跳转方案、拦截器的使用等。这一篇文章主要是对该框架的源码进行分析: ARouter是通过APT生成代码在框架内部进行操作,那么,项目编译生成的文件位置在那里? 项目编译生成的文件位置 既然生成了这些源码,我们就先随便点点看看这些都是啥? 源码 - 1 源码 - 2 源码 - 3 源码 - 4 这里简简单单随便截图了APT生成的部分源码,是不是感觉跟上一篇文章使用到的代码很多相似性呐~比如拦截器的优先级是1、跳转匹配的路径也是一样的、跳转传递的参数、定义的组名等等。既然这么多一样的那肯定是在内部某部分进行封装使用,带着这个问题我们开始逐步分析。 首先,我们从该框架使用到的注解开始分析(因为注解是使用这个框架的起点) 注解分析: 首先,我们知道要使用ARouter的首先需要在类的注释上面写上 @Route 这个注解,点进源码看看 Route注解 使用该注解标注的类将被自动添加至路由表中。而且,ARouter 并非仅提供页面...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池