【问题标题】:Getting local storage path for an image from "content:" based Uri从基于“内容:”的 Uri 获取图像的本地存储路径
【发布时间】:2016-06-10 14:51:21
【问题描述】:

好的。我正在为此拉头发。我正在使用以下代码通过 FTP 上传用户选择的照片。

            using (WebClient client = new WebClient())
            {
                client.Credentials = new NetworkCredential("[username]", "[password]");
                client.UploadFile("XXXXXXXXXX" + destinationName, "STOR", sourceFile);
            }

这是一个标准的 .net 实现。问题是源文件。我已经实现了一个点击事件,以及一个返回事件。

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        if ((requestCode == PickImageId) && (resultCode == Result.Ok) && (data != null))
        {

        }
    }

这是让我发疯的问题。我需要从 OnActiveResult 事件返回的所选照片的​​物理路径,以便 FTP 正确上传。

我试过了;

Android.Net.Uri uri = data.Data;
physicalAddress = Convert.ToString(data.Data);
physicalAddress = Convert.ToString(uri);

这些都不返回路径,只是“content:\android.provider.media\documents\document\image%123164”

当提供给上面的函数时,返回一个错误,因为提供的源文件不存在。

拔头发!请帮忙!

【问题讨论】:

标签: c# android xamarin ftp xamarin.android


【解决方案1】:

这是从基于图像内容的 Uri 中提取完整路径的完整示例。

注意:这将适用于 KitKit 及更高版本。

[Activity(Label = "FilePathFromContentURI", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
        Button button = FindViewById<Button>(Resource.Id.myButton);
        button.Click += delegate { 
            Intent intent = new Intent();
            intent.SetType("image/*");
            intent.SetAction(Intent.ActionGetContent);
            StartActivityForResult(Intent.CreateChooser(intent, "Select Image"), 1);
        };
    }

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

        ICursor cursor = null;
        try
        {
            // assuming image
            var docID = DocumentsContract.GetDocumentId(data.Data);
            var id = docID.Split(':')[1];
            var whereSelect = MediaStore.Images.ImageColumns.Id + "=?";
            var projections = new string[] { MediaStore.Images.ImageColumns.Data };
            // Try internal storage first
            cursor = ContentResolver.Query(MediaStore.Images.Media.InternalContentUri, projections, whereSelect, new string[] { id }, null);
            if (cursor.Count == 0)
            {
                // not found on internal storage, try external storage
                cursor = ContentResolver.Query(MediaStore.Images.Media.ExternalContentUri, projections, whereSelect, new string[] { id }, null);
            }
            var colData = cursor.GetColumnIndexOrThrow(MediaStore.Images.ImageColumns.Data);
            cursor.MoveToFirst();
            var fullPathToImage = cursor.GetString(colData);
            Log.Info("MediaPath", fullPathToImage);
        }
        catch (Error err)
        {
            Log.Error("MediaPath", err.Message);
        }
        finally
        {
            cursor?.Close();
            cursor?.Dispose();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2016-06-22
    相关资源
    最近更新 更多