2014-04-26 4 views
2

현재 인 텐트가있는 파일을 선택하려고합니다. 내 문제는 반환 된 경로가 올바른 형식이 아님을 나타냅니다.Android 파일 경로 (Xamarin)

내 의지 :

private void selectAudioFile(object sender, EventArgs eventArgs) 
{ 
    Intent = new Intent(); 
    Intent.SetType("audio/*"); 
    Intent.SetAction(Intent.ActionGetContent); 
    StartActivityForResult(Intent.CreateChooser(Intent, "Select Audio File"), PickAudioId); 
} 

그리고 rusult 방법 :

protected override void OnActivityResult (int requestCode, Result resultCode, Intent data) { 
    base.OnActivityResult (requestCode, resultCode, data); 
    if ((resultCode == Result.Ok) && (requestCode == PickAudioId) && (data != null)) { 
     Android.Net.Uri uri = data.Data; 
     if (!File.Exists(uri)) { 
      // error 
     } 
    } 
} 

문제점 :

내가 파일 클래스와 수신 경로를 처리해야합니다. 경로는 /document/audio : 1234입니다. 으로 경로를 확인하는 경우 File.Exists (uri) 파일이 존재하지 않습니다.

어떻게 내가 그런 /storage/emulated/0/Music/foo.mp3이나 뭐 같은 파일으로 처리 할 수있는 형식으로이 파일의 경로를 얻을 수 있나요? 도움

답변

3

당신이 대가로 얻을 URI가 경로처럼 보일 수 있지만, 그것은 더 많은 데이터베이스 레코드에 대한 바로 가기처럼, 아니다에 대한

감사합니다.

당신은 컨텐트 리졸버를 사용할 수있어 실제 경로가 꽤 입입니다 검색하려면 여기 ( that sample from Xamarin 기준)을 검색하는 방법은 다음과 같습니다

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

      string path = GetPathToImage(data.Data); 

      if (!File.Exists (path)) { 
       Log.Debug ("","error"); 
      } else { 
       Log.Debug ("","ok"); 
      } 
     } 
    } 

    private string GetPathToImage(Android.Net.Uri uri) 
    { 
     string path = null; 
     // The projection contains the columns we want to return in our query. 
     string[] projection = new[] { Android.Provider.MediaStore.Audio.Media.InterfaceConsts.Data }; 
     using (ICursor cursor = ManagedQuery(uri, projection, null, null, null)) 
     { 
      if (cursor != null) 
      { 
       int columnIndex = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Audio.Media.InterfaceConsts.Data); 
       cursor.MoveToFirst(); 
       path = cursor.GetString(columnIndex); 
      } 
     } 
     return path; 
    } 

당신이 다른 Android.Provider 추가 할 수 있습니다. MediaStore.Audio.Media.InterfaceConsts.XXX 값이 하나가 또한 작동하지 않는 파일

++

+3

에 대해 더 많은 정보를 얻을 수 – Mayank