【问题标题】:Monodroid setting imageview to image stored on sdcardMonodroid 将 imageview 设置为存储在 sdcard 上的图像
【发布时间】:2023-03-23 00:35:01
【问题描述】:

如何拍摄照片并将其保存到特定文件夹。我知道它保存到 sdcard/DCIM/etc

但我不希望它在那里,我希望它存储在 /sdcard/Camera 的文件夹中

我制作了以下目录:

String destPath = Android.OS.Environment.ExternalStorageDirectory + "/Camera";

然后我启动相机意图并尝试将保存文件指向我创建的路径。

Intent launchCamera = new Intent(Android.Provider.MediaStore.ActionImageCapture);
launchCamera.PutExtra(MediaStore.ExtraOutput, destPath);

这行不通。图像仍会保存到 /sdcard/dcim/etc

想法?

【问题讨论】:

    标签: android camera xamarin.android


    【解决方案1】:

    我想添加到 lanks 的解决方案。

    假设您使用以下代码拍照

    var uri = ContentResolver.Insert(MediaStore.Images.Media.ExternalContentUri,
                                     new ContentValues());
    
    var intent = new Intent(MediaStore.ActionImageCapture);
    intent.PutExtra(MediaStore.ExtraOutput, uri);
    StartActivityForResult(intent, ACTIVITY_RESULT_PICTURE_TAKEN);
    
    pictureUri = uri;
    

    ACTIVITY_RESULT_PICTURE_TAKEN 只是一个简单的值,您可以在 OnActivityResult 检查哪个活动已完成。

    您的 OnActivityResult 可能如下所示:

    protected override void OnActivityResult(int requestCode, 
                                             Result resultCode, Intent data)
    {
        if (resultCode == Result.Ok && requestCode == ACTIVITY_RESULT_PICTURE_TAKEN)
        {
             string picturePath = GetRealPathFromURI(pictureUri);
             //Do something with the file
        }
    }
    

    你之前得到的 Uri 是 android 特有的,需要翻译。

    它看起来像“//content://media/external/media/11917”,这不是 有效路径。

    这正是 GetRealPathFromURI 函数的作用:

    public string GetRealPathFromURI(Android.Net.Uri contentUri)
    {            
        var mediaStoreImagesMediaData = "_data";
        string[] projection = { mediaStoreImagesMediaData };
        Android.Database.ICursor cursor = this.ManagedQuery(contentUri, projection, 
                                                            null, null, null);
        int columnIndex = cursor.GetColumnIndexOrThrow(mediaStoreImagesMediaData);
        cursor.MoveToFirst();
        return cursor.GetString(columnIndex);
    }
    

    一旦你得到了真正的路径,你就可以按照 lanks 的建议将它移动到任何你想要的地方。

    【讨论】:

      【解决方案2】:

      当我使用 Monodroid 开发应用程序时,我收集到的信息是,相机有很多问题,并且大多数时候不能按照您的意愿进行操作。这包括指定要保存图像捕获的目标。 据我所知,这些问题并不是 Monodroid 特有的,并且确实发生在 java android sdk 中。

      您可能想要查看的解决此问题的方法是在不指定目标的情况下捕获图像,然后在 OnActivityResult 方法中检索保存到图库中的最新图像。获得最新图像后,您可以将其移动到您的首选目的地。

      这是 OnActivityResult 中的一些示例代码。

      获取捕获图像的文件名

      Android.Net.Uri targetUri = data.Data;
      String origin = "";
      String [] proj = { MediaStore.MediaColumns.Data.ToString (), BaseColumns.Id };
      
      var qry = ManagedQuery (MediaStore.Images.Media.ExternalContentUri, proj, null, null, "date_added DESC");
      
      qry.MoveToFirst ();
      
      origin = qry.GetString (qry.GetColumnIndexOrThrow (MediaStore.MediaColumns.Data.ToString ()));
      

      将图像移动到您想要的目的地

      System.IO.File.Move (origin, "yourdestinationfilenamehere");
      

      【讨论】:

        猜你喜欢
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 2014-09-03
        相关资源
        最近更新 更多