2017-02-08 8 views
-1

私はアプリを開発しています。そのアプリには「サウンドを選択」というボタンが1つあります。ユーザーがこのボタンをクリックすると、ファイルマネージャ/メモリから任意のオーディオファイルを選択するように求められます。Android sdcard/file managerからオーディオファイルを読み込んで再生する方法

私はこのために、Intent.Action_GetDataを使用する必要があることを知っています。私は同じことをやっている:Android 4.4前に、それは返すので

//code start 
Intent intent = new Intent(); 
intent.setType("audio/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(intent,1); 

@Override 
protected void onActivityResult(int requestCode,int resultCode,Intent data){ 

    if(requestCode == 1){ 

    if(resultCode == RESULT_OK){ 

     //the selected audio. 
     Uri uri = data.getData(); 
int SoundID=soundPool.Load(uri.toString(), 1); 
//SoundPool is already constructed and is working perfectly for the resource files 
PlaySound(SoundID); 
//PlaySound method is already defined 
    } 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 
//end of code 

が、それは今
を働いていない、OnActivityResultに、私は、どのようにユーザーが選択したファイルの適切なURIをロードすることになっていませんよ異なるURIを返し、Android 4.4の後に別のURIをintent.GetData();に返します。今、私は何をしなければならないのですか?

また、私はオーディオファイルを再生するために、SoundPoolを使用しなければならないことを知っています。実際には、リソース/ raw /オーディオファイルに対してうまく動作していますが、/SoundPoolのファイルをURIから再生しますか?

+0

「OnActivityResult」で行ったことをコードを投稿することはできますか?そして、あなたはどのように 'URI'を取得していますか? –

+0

@Prathamesh Toradmalはコード –

答えて

2

onActivityResult()、 llowingの変更:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == Activity.RESULT_OK && data != null) 
    { 
     String realPath = null; 
     Uri uriFromPath = null; 

     realPath = getPathForAudio(YourActivity.this, data.getData()); 
     uriFromPath = Uri.fromFile(new File(realPath)); // use this uriFromPath for further operations 
    } 
}  

あなたActivityにこのメソッドを追加します。

public static String getPathForAudio(Context context, Uri uri) 
{ 
    String result = null; 
    Cursor cursor = null; 

    try { 
     String[] proj = { MediaStore.Audio.Media.DATA }; 
     cursor = context.getContentResolver().query(uri, proj, null, null, null); 
     if (cursor == null) { 
      result = uri.getPath(); 
     } else { 
      cursor.moveToFirst(); 
      int column_index = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA); 
      result = cursor.getString(column_index); 
      cursor.close(); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
    return result; 
} 

は、それはあなたの仕事をすることを願っています。 MediaPlayerクラスを使用してオーディオを再生することもできます

+0

こんにちは親愛なる友人、ありがとう、ファイルに適切なパスを取得できるようになりましたSoundPool.Loadメソッドを使用してサウンドを読み込むことはできません。私は手動でこのメソッドにファイル名を与えることを試みたが動作しない、私は方法自体にいくつかの問題があると思う:SoundPool.Load(文字列パス、int優先順位)あなたは助けてもらえますか? –

+0

こんにちは、MediaPlayerクラスで同じことを試してみました。なぜそれがSoundPoolで動作しないのか理解できません。何か案は? –

+0

私はSoundPoolを使用したことがないので、これも自信がありません。それが私がMediaPlayerについて提案した理由です。 SoundPoolについて勉強しなければなりません。 :)私は何かを見つけたら教えてあげます。 –

0

オーディオを選択したいときは、以下のコードをプロジェクトに挿入できます。

Intent intent_upload = new Intent(); 
intent_upload.setType("audio/*"); 
intent_upload.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(intent_upload,1); 

そして

@Override 
protected void onActivityResult(int requestCode,int resultCode,Intent data){ 

    if(requestCode == 1){ 

    if(resultCode == RESULT_OK){ 

     //the selected audio. 
     Uri uri = data.getData(); 
    } 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 
+0

を書きました。私はすでにこのアプローチを試みましたが、このコードは機能しません。まず第一に、すべてのアプリケーションが異なるURIを返す、第二に、SoundPool.Load methoadはURIを受け入れず、サウンドをロードしない –

0

下のパスを取得しようとして、同じ活動にonActivityResult上書き:

//method to get the file path from uri 
    public String getPath(Uri uri) { 
     Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
     cursor.moveToFirst(); 
     String document_id = cursor.getString(0); 
     document_id = document_id.substring(document_id.lastIndexOf(":") + 1); 
     cursor.close(); 

     cursor = getContentResolver().query(
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null); 
     cursor.moveToFirst(); 
     String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
     cursor.close(); 

     return path; 
    } 

それをロードします。あなたには

s2 = soundPool.load(YOU_PATH, PRIORITY); 
関連する問題