游戏王中国 2023-03-02 15:59 采纳率: 53.3%
浏览 54
已结题

xamarin 相册浏览功能

xamarin 相册浏览功能


  //浏览相册
        private void Btn_Browse_Click(object sender, EventArgs e)
        {
             Intent _intentCut = new Intent(Intent.ActionPick, null);
            _intentCut.SetType("image/*");// 设置文件类型
            CameraHelper._file = finalFile;//照片的保存路径即相册

            _intentCut.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(CameraHelper._file));
          StartActivityForResult(_intentCut, requestCode_browse); //2代表看相册
        }

 if (requestCode == requestCode_shot)//拍照看照片请求
                {
                    if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
                    {
                        int height = Resources.DisplayMetrics.HeightPixels;
                        int width = iv.Height;

                        //获取拍照的位图
                        CameraHelper.bitmap = CameraHelper._file.Path.LoadAndResizeBitmap(width, height);
                        if (CameraHelper.bitmap != null)
                        {
                            //将图片绑定到控件上
                            iv.SetImageBitmap(CameraHelper.bitmap);

                            //清空bitmap 否则会出现oom问题
                            CameraHelper.bitmap = null;
                        }

                        // Dispose of the Java side bitmap.
                        GC.Collect();

                        string fileName = CameraHelper._file.Name.ToString();
                        Toast.MakeText(this, fileName, ToastLength.Long).Show();
                    }

```c#
  var url = Android.Net.Uri.Parse("file://" + GetPath(BaseContext, data.Data));
                        //data.SetData(url);
                        //将本地相册照片显示在控件上
                        //Toast.MakeText(this, "报错位置", ToastLength.Long).Show();
                        //iv_备注信息图片显示控件.SetImageURI(null);


                        //方法一测试虚拟机可以  真机子错误     **求个解析真实路径方法,华为安卓手机路径**
                        //iv_备注信息图片显示控件.SetImageURI(Android.Net.Uri.FromFile(new Java.IO.File(GetPath(BaseContext, data.Data))));


                        //方法二测试虚拟机可以  真机子错误   **求个解析真实路径方法,华为安卓手机路径**
                        //Bitmap bmp = (Bitmap)data.GetParcelableExtra("data");


                        //方法三测试虚拟机可以  真机子错误   **求个解析真实路径方法,华为安卓手机路径**
                        //Bitmap bmp = BitmapFactory.DecodeFile(url.Path);
                        //iv_备注信息图片显示控件.SetImageBitmap(bmp);

                        //方法四测试虚拟机可以 真机子错误   **求个解析真实路径方法,华为安卓手机路径**
                        iv_备注信息图片显示控件.SetImageURI(url);


                        //测试四虚拟机子可以 真机子失败   **求个解析真实路径方法,华为安卓手机路径**
                        //ContentResolver cr = this.ContentResolver;
                        //System.IO.Stream inputis = cr.OpenInputStream(url);
                        ////picUrl = new URL(getIntent().getExtras().getString("map_url"));
                        //Bitmap pngBM = BitmapFactory.DecodeStream(inputis);
                        //iv_备注信息图片显示控件.SetImageBitmap(pngBM);

                        //方法五测试失败
                        //ContentResolver cr = this.ContentResolver;
                        //System.IO.Stream inputis = cr.OpenInputStream(url);
                        //System.Drawing.Image imgs = System.Drawing.Bitmap.FromStream(inputis);
                        //byte[] by = ImageToBytes(imgs);
                        //Android.Graphics.Bitmap bitmap =BitmapFactory.DecodeByteArray(by, 0, by.Length);
手机上为什么失败了     虚拟机又可以
觉得应该路径问题

  #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;
        }

**求个解析真实路径方法,华为安卓手机路径**

img

原文链接:https://blog.csdn.net/u014194297/article/details/100376297

真机子运行报错如何解决

img

  • 写回答

2条回答 默认 最新

  • MarkHan_ 2023-03-03 16:16
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    根据您提供的代码和描述,很可能是路径问题导致了错误。

    在 Android 平台上,不同的手机厂商可能会对文件系统进行不同的实现和定制,因此可能需要使用不同的方法来获取文件路径。

    您可以尝试使用以下代码来获取真实路径:

    public static string GetRealPathFromURI(Context context, Android.Net.Uri uri)
    {
        string[] proj = { MediaStore.Images.Media.InterfaceConsts.Data };
        var cursor = context.ContentResolver.Query(uri, proj, null, null, null);
        var columnIndex = cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.Data);
        cursor.MoveToFirst();
        var path = cursor.GetString(columnIndex);
        cursor.Close();
        return path;
    }
    
    
    

    您可以在您的代码中使用此方法,像这样:

    string realPath = GetRealPathFromURI(this, data.Data);
    iv_备注信息图片显示控件.SetImageURI(Android.Net.Uri.Parse("file://" + realPath));
    
    
    

    这应该可以帮助您在不同的设备上获取正确的文件路径,并在控件中显示相册图片。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 修改了问题 3月3日
  • 赞助了问题酬金15元 3月3日
  • 展开全部

悬赏问题

  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗