当前位置: 首页 > 知识库问答 >
问题:

无法从解码文件位图传递图像路径(Xamarin Android)路径返回空异常错误

濮阳茂材
2023-03-14

我试图通过我的图像与意图在Xamarin Android与C#。在第一个活动中,我使用bitmapfactory.decodeFile(uri_path);将图像路径解码为位图文件。我还用imgview.setimageBitmap(bitmap)设置位图图片;然后,在单击按钮时传递URI路径,该按钮将使用intent.putextra(“path”,mCurrentPhotoPath);将图片引用到下一个活动。在下一个活动中,我想从第一个活动中获得传递路径值。

string path = intent.GetStringExtra("path");

            if (path != null)
            {
                Bitmap bitmap = BitmapFactory.DecodeFile(path);
                m_imageView.SetImageBitmap(bitmap);
            }

            else
            {
                Toast.MakeText(this, "Your picture empty!", ToastLength.Long).Show();
            }

但是,我得到一个带有空异常错误的错误。路径返回null,程序崩溃。请帮帮我!几个小时后我觉得卡住了。有人帮忙吗?以下是我的完整代码:

第一个活动-我的onActivityResult

private Button btnContinue, btnCapture;
        private ImageView imgView;
        public Bitmap BitMap;
        private Android.Net.Uri filePath;
        private const int c_TAKE_IMAGE_REQUSET = 72;
        private ProgressBar progressBar;
        public String mCurrentPhotoPath = null;

public override void OnActivityResult(int requestCode, int resultCode, Intent data) 
    {
        base.OnActivityResult(requestCode, resultCode, data);

    if (requestCode == c_TAKE_IMAGE_REQUSET &&
        resultCode == (int)Result.Ok &&
        data != null)
    {
        filePath = data.Data;
        //String mCurrentPhotoPath = null;
        try
        {
            mCurrentPhotoPath = GetRealPathFromURI(filePath);
        }
        catch (Exception ex)
        {
            // Failed for some reason.
        }

        try
        {
            BitMap = (Bitmap)data.Extras.Get("data");
            imgView.SetImageBitmap(BitMap);
            BitMap = BitmapFactory.DecodeFile(mCurrentPhotoPath);
            System.Diagnostics.Debug.WriteLine("Image path == " + mCurrentPhotoPath);
        }
        catch (System.IO.IOException ex)
        {
            System.Console.WriteLine(ex);
        }

        var bitmap = BitmapFactory.DecodeFile(mCurrentPhotoPath); // decode the path into bitmap 
        imgView.SetImageBitmap(bitmap);
    }
}

private string GetRealPathFromURI(Android.Net.Uri uri)
    {
        string doc_id = "";
        using (var c1 = this.View.Context.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 = this.View.Context.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;
    }
}

第二个活动-onCreate protected override void onCreate(Bundle savedInstanceState){base.onCreate(savedInstanceState);

        SetContentView(Resource.Layout.Upload);

        string path = intent.GetStringExtra("path");

        if (path != null)
        {
            Bitmap bitmap = BitmapFactory.DecodeFile(path);
            m_imageView.SetImageBitmap(bitmap);
        }

        else
        {
            Toast.MakeText(this, "Your picture empty!", ToastLength.Long).Show();
        }

        m_upload.Click += M_upload_Click;

    }

编辑:我把我的放入字符串额外在我的按钮。按钮是button Continue,它是对下一个活动的引用

private void btnContinue_Click(object sender, EventArgs e)
        {
            Busy();
            Intent intent = new Intent(Activity, typeof(UploadActivity));
            intent.PutExtra("path", mCurrentPhotoPath);
            StartActivity(intent);
        }

共有1个答案

阚元白
2023-03-14

我认为这只发生在您拍摄了一张照片之后,因为filepath=data.data;返回null,如果您从照片中选择一张图片,它将返回它的URI

因此,您可以尝试使用其他方法,可以在拍照后传递位图的字节[]数据:

public override void OnActivityResult(int requestCode, int resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (requestCode == c_TAKE_IMAGE_REQUSET &&
            resultCode == (int)Result.Ok &&
            data != null)
        {

            try
            {
                mBitMap = (Bitmap)data.Extras.Get("data");
                imgView.SetImageBitmap(mBitMap);
                using (var stream = new MemoryStream())
                {
                    mBitMap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);
                    bitmapData = stream.ToArray();
                }
            }
            catch (System.IO.IOException ex)
            {
                System.Console.WriteLine(ex);
            }
        }
    }

然后可以传递bitmapdata:

Intent intent = new Intent(Activity, typeof(UploadActivity));
intent.PutExtra("img", bitmapData);
StartActivity(intent);

在新活动中显示:

byte[] bitmapbyte = Intent.GetByteArrayExtra("img");
Bitmap bitmap = BitmapFactory.DecodeByteArray(bitmapbyte, 0, bitmapbyte.Length);
m_imageView.SetImageBitmap(bitmap);

更新:

如果要使用文件路径,可以如下所示:

private Java.IO.File outputImage;
private Android.Net.Uri photoUri;   // the camera takes a photo and returns the image path    

//Create a file object to store the image after the photo is taken, which is also the photo path after the photo is taken successfully
Java.IO.File outputImage = new Java.IO.File(xxx,xxx);
//determine the current Android version
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
    {
      photoUri = FileProvider.GetUriForFile(this, "xxxxx", outputImage);
    }
else
    {
      photoUri = Android.Net.Uri.FromFile(outputImage);
    }

 Intent intent = new Intent(MediaStore.ActionImageCapture);
 intent.PutExtra(MediaStore.ExtraOutput, photoUri);
 StartActivityForResult(intent, TAKE_IMAGE_REQUSET);

然后可以使用photori

在某些设备上,您可以使用以下方法保存图片并获取路径。

filePath = Android.Net.Uri.Parse(MediaStore.Images.Media.InsertImage(Activity.ContentResolver, mBitMap, null, null)); 
 类似资料:
  • 我试图从画廊获取图像并存储到数据库的路径以供进一步使用。文件路径保存在数据库中,但我无法在ImageView上获得视图。 文件路径为: /storage/emulated/0/DCIM/Camera/image.jpg 这里我得到的图像路径是imgS 在这里,我试图检索路径并在图像视图中显示图像。 注意:文件存在于路径中。

  • 问题内容: 我的Java应用程序有问题,特别是从计算机中的某个位置加载图像时。 在这篇文章之后,我使用和来在计算机上加载图像。首先,我将图片()放入源代码中,并且可以正常工作。但是,如果我将图像放到另一个地方(比如说),Java IDE会向我显示一个 这是代码: 问题答案: &不适用于文件路径,但适用于相对于代码库的路径。如果代码库为,则可以找到资源的相对路径为。 通过加载文件之间..differ

  • 我在使用Glide加载图像时有问题。当我试图使用Android默认的它起作用了,但我遇到了内存泄漏问题。 然后我尝试了Glide图像加载器来避免内存泄漏问题。但是我不能使用文件路径加载图像。 我也尝试加载Uri,但也不起作用。 然后我试着从URL Glide加载图像加载URL图像。效果很好。 有人能帮我找到解决这个问题的方法吗?

  • 我有一个图像文件夹的相对路径的问题。我想把图片列到一个文件夹中,把它们的网址添加到列表中,并在jsp中显示出来。代码是这样的: 我试过好几条路,但都不走运。非常感谢你。

  • 问题内容: 我正在使用python进行文件操作。 我有一个文件路径为: 当我使用python打开文件时,它说: 但是,该文件存在于驱动器上。 可能是因为窗口包含空格,所以无法正确获取“ SEM 2”。 如何在窗口路径的路径中处理此类空格? 问题答案: 路径中的空格没有问题,因为您没有使用“外壳”来打开文件。这是Windows控制台上的一个会话来证明这一点。你做错了什么

  • 问题内容: 我正在建立一个带有react和webpack的网站。当我使用webpack构建应用程序并尝试包含图像时,图像与其他资产一起写入了build文件夹,但是webpack输出的图像链接不正确。我可以进入构建文件夹并查看图像,因此正确复制了该图像,这是链接错误。 我的react组件看起来像这样: 我的Webpack配置如下所示: 从昨天开始,我就一直把头撞在墙上,因此,我们将不胜感激。让我知道