2015-09-18 79 views
0

我有一个主要活动,其中有一个按钮和图像视图控件。我可以将从设备存储中选择的图片显示到Imageview。但是当我尝试从Intent获取图像URI时会发生错误。从图像视图中选择从SD卡中的图像获取物理路径并上传到服务器

我的按钮单击事件代码

private void TakeAPicture (object sender, EventArgs eventArgs) 
     { 
      var imageIntent = new Intent(); 
      imageIntent.SetType ("image/*"); 
      imageIntent.SetAction (Intent.ActionGetContent); 
      StartActivityForResult(Intent.CreateChooser(imageIntent, "Select Image"),0); 
} 

OnActivityresult重写代码

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

      if (resultCode == Result.Ok) { 
       Uri selectedImageUri = data.GetData();// code to get URI and I am stuck here 
       string selectedImagePath = ImageFilePath.getPath(context, selectedImageUri);    
       var imageView = 
        FindViewById<ImageView> (Resource.Id.imageView1); 

       UploadImage (selectedImagePath); 


      } 

完整的错误文本

Error CS1061: 'Android.Content.Intent' does not contain a definition for 'GetData' and no extension method 'GetData' accepting a first argument of type 'Android.Content.Intent' could be found (are you missing a using directive or an assembly reference?) (CS1061) (Capture) 

为什么我得到这个错误。在Android意图中是否没有称为GetData()的方法,或者我是否缺少任何特定的库?

+0

它的小'g'试试这个'data.getData()' –

+0

仍然是一样的错误:-( – Binoy

回答

2

onButtonclick(); -

Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

     startActivityForResult(galleryIntent, SELECT_FILE); 

onActivityResult(); -

   Uri selectedImage = data.getData(); 
       String[] filePathColumn = { MediaStore.Images.Media.DATA }; 


       Cursor cursor = getContentResolver().query(selectedImage, 
         filePathColumn, null, null, null); 

       cursor.moveToFirst(); 

       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String imgPath = cursor.getString(columnIndex); 
       cursor.close(); 
+0

其实当我试图intent.Data而不是intent.getData()错误已解决 – Binoy

1

可以使用这个 -

Uri selectedImage = data.getData(); 
    String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

    Cursor cursor = activity.getContentResolver().query(
      selectedImage, filePathColumn, null, null, null); 
    cursor.moveToFirst(); 

    picturePath = cursor.getString(cursor.getColumnIndex(filePathColumn[0])); 
1

有在Xamarin典型模式获得完整路径它将Android Java组件getter映射到C#的get only(set not implemented)属性。

在你的情况下,Java代码android.content.Intent.getData被映射到Intent.Data的C#属性,如下所示:

namespace Android.Content 
{ 
    [Register ("android/content/Intent", DoNotGenerateAcw = true)] 
    public class Intent : Object, IParcelable, ICloneable, IJavaObject, IDisposable 

     public virtual Uri Data { 
      [Register ("getData", "()Landroid/net/Uri;", "GetGetDataHandler")] ... 

您还可以找到其他的Java干将如getComponent被映射到“分量”的如下属性:记住这Xamarin的Java与C#的映射模式

 public virtual ComponentName Component { 
     [Register ("getComponent", "()Landroid/content/ComponentName;", "GetGetComponentHandler")] 
     get { 
      if (Intent.id_getComponent == IntPtr.Zero) { 
       Intent.id_getComponent = JNIEnv.GetMethodID (Intent.class_ref, "getComponent", "()Landroid/content/ComponentName;"); 
      } ... 

会帮你翻译的Java代码到C#,并避免被卡住:-)。

如果您使用Xamarin工作室,请在OSX或Windows上的F12上使用Cmd + D检查Xamarin源代码,同时在源代码中使用'Intent'一词,这将增加您对此映射工作方式的理解深度。

+0

非常感谢以上提到点 – Binoy

相关问题