代码之家  ›  专栏  ›  技术社区  ›  apex

获取画廊图像Xamarin的路径?

  •  1
  • apex  · 技术社区  · 8 年前

        void ChoosePhoto()
        {
            try
            {
                var imageIntent = new Intent();
                imageIntent.SetType("image/*");
                imageIntent.SetAction(Intent.ActionGetContent);
                StartActivityForResult(Intent.CreateChooser(imageIntent, "Select photo"), 0);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        } 
    
    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
    
            if (requestCode == CAMERA_CAPTURE)
            {
            // camera operation
            }
            else
            {
                Console.WriteLine("choose pic from Gallery");
                var uri = data.Data;
                var path = getRealPathFromURI(uri); //path returns null when i select image from external storage;
            }
        }
        private String getRealPathFromURI(Uri contentURI)
        {
            string[] proj = { MediaStore.Images.ImageColumns.Data };
            String result;
            var cursor = ContentResolver.Query(contentURI, proj, null, null, null);
            if (cursor == null)
                result = contentURI.Path;
            else
            {
                int idx= cursor.GetColumnIndex(MediaStore.Images.ImageColumns.Data);
                cursor.MoveToFirst();
                result = cursor.GetString(idx);
                cursor.Close();
            }
            return result;
        }
    
    1 回复  |  直到 8 年前
        1
  •  7
  •   York Shen    8 年前

    我想得到我从图库中选择的图像路径

    Android.Net.Uri path ,这里有一个解决方案:

    private string GetPathToImage(Android.Net.Uri uri)
    {
        string doc_id = "";
        using (var c1 = ContentResolver.Query(uri, null, null, null, null))
        {
            c1.MoveToFirst();
            string document_id = c1.GetString(0);
            doc_id = document_id.Substring(document_id.LastIndexOf(":") + 1);
        }
    
        string path = null;
    
        // The projection contains the columns we want to return in our query.
        string selection = Android.Provider.MediaStore.Images.Media.InterfaceConsts.Id + " =? ";
        using (var cursor = ContentResolver.Query(Android.Provider.MediaStore.Images.Media.ExternalContentUri, null, selection, new string[] { doc_id }, null))
        {
            if (cursor == null) return path;
            var columnIndex = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Images.Media.InterfaceConsts.Data);
            cursor.MoveToFirst();
            path = cursor.GetString(columnIndex);
        }
        return path;
    }
    

    ChoosePhoto();
    ...
     protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        if (requestCode == 0)
        {
            var uri = data.Data;
            var path = GetPathToImage(uri);
            System.Diagnostics.Debug.WriteLine("Image path == " + path );
            //My result is this ==> [0:] Image path == /storage/emulated/0/DCIM/Camera/IMG_20170813_223324.jpg
        }
     }
    

    最重要的 ,当您使用此方法时,可能会遇到以下问题:

    Java语言Lang.SecurityException:权限拒绝:读取com。安卓供应商。媒体MediaProvider uricontent://media/external/images/media从pid=21975,uid=10417需要android。准许READ\u EXTERNAL\u STORAGE,或grantUriPermission()

    Requesting Permissions at Run Time ,用户在应用程序运行时授予应用程序权限,而不是在安装应用程序时。你应该检查一下 android.permission.READ_EXTERNAL_STORAGE 权限,如果没有,则需要请求权限。