2017-01-28 3 views
2

Я бы хотел, чтобы пользователь выбирал аудиофайл, а затем хотел бы получить путь к файлу. Однако у меня есть еще более простая проблема, потому что Uri намерения я получаю null. Как я мог получить что-то значимое, то есть непустое?Как получить ненулевые данные из намерения при выборе файла?

Начиная Намерение:

private void MainActivity_Click1(object sender, System.EventArgs e) 
    { 
     //var intent = new Intent(); 
     var intent = new Intent(Intent.ActionPick, Android.Provider.MediaStore.Audio.Media.ExternalContentUri); 

     intent.SetType("audio/*"); 
     intent.SetAction(Intent.ActionGetContent); 
     StartActivityForResult(
      Intent.CreateChooser(intent, "Select audio file"), SelectAudioCode); 
    } 

И отвечая на выбор:

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

     if (resultCode == Result.Ok && requestCode==SelectAudioCode) 
     { 
      Android.Net.Uri uri = Intent.Data; 
      audioFileNameText.Text = uri == null ? "<NULL>" : uri.ToString(); 
     } 
    } 

Независимо от того, как я создать intent (см код выше), я не вижу всегда NULL.

Update: если я использую Intent передается через параметр, то Data свойство этого является null, а также.

ответ

2

Я бы хотел, чтобы пользователь выбирал аудиофайл, а затем хотел бы получить путь к нему. Однако у меня есть еще более простая проблема, потому что Uri намерения, которое я получаю, является нулевым.

Вы можете получить информацию Uri от data.Data. Но если вы хотите, чтобы получить путь к файлу из содержимого Урия, вам нужно преобразовать Ури контента в реальный путь:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) 
{ 
    base.OnActivityResult(requestCode, resultCode, data); 
    string abc= getRealPathFromURI(this,data.Data); 
} 


public string getRealPathFromURI(Context context, Uri contentUri) 
{ 
    ICursor cursor = null; 
    try 
    { 
     string[] proj = { MediaStore.Audio.AudioColumns.Data}; 
     cursor = ContentResolver.Query(contentUri, proj, null, null, null); 
     int column_index = cursor.GetColumnIndexOrThrow(MediaStore.Audio.AudioColumns.Data); 
     cursor.MoveToFirst(); 
     return cursor.GetString(column_index); 
    } 
    finally 
    { 
     if (cursor != null) 
     { 
      cursor.Close(); 
     } 
    } 
} 

Explaination Update:

Намерение вы используете по Intent.Data является намерение что начать текущую деятельность, а не намерение, что Chooser вернулся:

enter image description here

Таким образом, вместо того, чтобы использовать Intent.Data вам нужно использовать intent повторно повернуто Селектор деятельность, которая является data аргументом:

enter image description here

+0

Спасибо, но поскольку я написал - «У меня более простая проблема, Uri - это нуль». То есть как вы написали «Вы можете получить содержимое Uri из data.Data», это еще один шаг для меня, потому что 'data.Data' является« null ». Я не могу обработать его вообще. – greenoldman

+1

Цель, которую вы используете, - это намерение, которое запускает текущую деятельность, но вы можете получить только Uri из намерения, возвращенного Chooser. @greenoldman сожалеет, что не уточнил, что ясно, я обновил свой ответ, чтобы прояснить разницу между намерением текущей деятельности и намерением в «OnActivityResult». –

+0

Спасибо, я также обновлю свой вопрос, я также проверил это «намерение». Его данные также равны null :-( – greenoldman

1

Похоже, вы используете Xamarin. Это эквивалент Java, который вы пытаетесь достичь.

Uri uri = Uri.fromFile(file); 

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(uri); 
intent.setType("audio/*"); 

this.startActivityForResult(intent,RESULT_CODE); 
+0

Спасибо, но какой должен быть файл?Я собираюсь попросить пользователя выбрать файл, поэтому я не знаю заранее, что он/она выберет. – greenoldman

Смежные вопросы