zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    leetcode 86. Partition List
    leetcode 303. Range Sum Query
    leetcode 1310. XOR Queries of a Subarray
    leetcode 1309. Decrypt String from Alphabet to Integer Mapping
    leetcode 215. Kth Largest Element in an Array
    将numpy.ndarray写入excel
    leetcode 1021 Remove Outermost Parentheses
    leetcode 1306. Jump Game III
    leetcode 1305. All Elements in Two Binary Search Trees
    ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
  • 原文地址:https://www.cnblogs.com/swjian/p/9037366.html
Copyright © 2011-2022 走看看