2

私はそのようなメディアプレーヤーでmp3ファイルを再生できることを知っています:

Intent intent = new Intent();  
intent.setAction(android.content.Intent.ACTION_VIEW);  
File file = new File(YOUR_SONG_URI);  
intent.setDataAndType(Uri.fromFile(file), "audio/*");  
startActivity(intent);

このリンクをたどって、次のようなURIを取得しようとしました。

Uri audio = Uri.parse("android.resource://com.audio.test/"+R.raw.audio1);
Log.d(TAG,"uri:"+audio.toString());

Uri audio = Uri.parse("android.resource://com.audio.test/raw/audio");
Log.d(TAG,"uri:"+audio.toString());

期待される結果を出力するもの:

01-24 15:28:23.190: D/MyClass(30234): uri:android.resource://com.audio.test/2131034112
01-24 15:29:13.: D/MyClass(30234): uri:android.resource://com.audio.test/raw/audio1

しかし、それは機能しません。メディアプレーヤーが起動しません。なぜ何かアイデアはありますか?

アップデート

createChooserを含めたところ、プレーヤーの予想リストの代わりに、「このアクションを実行するアプリケーションが見つかりません」というメッセージが表示されます。これは私の正確なコードです:

 public void playAudio(){
          Intent viewMediaIntent = new Intent();   
          viewMediaIntent.setAction(android.content.Intent.ACTION_VIEW);        
          Uri audio = Uri.parse("android.resource://com.audio.test/raw/"+R.raw.audio1);       
          Log.d(TAG,"uri:"+audio.toString());
          viewMediaIntent.setDataAndType(audio, "video/*");   
          viewMediaIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
          Log.d(TAG,"Starting");
          Intent i = Intent.createChooser(viewMediaIntent, "Play Music");
            mGap.startActivity(i);
          Log.d(TAG,"Started");
      }

アップデート2

説明してくれてありがとう@CommonsWare。これで、なぜ機能しないのかがわかりました。しかし、問題は残っています、私は私が望むことを達成できますか?file://スキームでraw / Assetsフォルダーに保存されているファイルのURIを取得しますか?

アップデート3

私はそれを行う方法を見つけましたが、それがうまくいくのは最善ではありません。ファイルが3つしかないので、実行がまったく遅れることはありません。ファイルをres/rawから電話のローカルディレクトリにコピーし、そのファイルからURIを取得しています。そのステップを回避する方法についての提案は大歓迎です。

 public void copyFileToDir(String audioFile){
          File test = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC + "/" + audioFile + ".mp3");
          if (test.exists()){
              Toast.makeText(mGap, "Exists", Toast.LENGTH_SHORT).show();
              return;
          }
          File dest = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
          int i = mGap.getResources().getIdentifier("raw/"+audioFile, "string", mGap.getPackageName());
          InputStream in = mGap.getResources().openRawResource(i);
          // Used the File-constructor
          OutputStream out;
        try {
            out = new FileOutputStream(new File(dest, audioFile + ".mp3"));
              // Transfer bytes from in to out
              byte[] buf = new byte[1024];
              int len;
              try {
                  // A little more explicit
                  while ( (len = in.read(buf, 0, buf.length)) != -1){
                       out.write(buf, 0, len);
                  }
              } finally {
                  // Ensure the Streams are closed:
                  in.close();
                  out.close();
              }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 


      }


      public void playAudio(String audioFile){
          copyFileToDir(audioFile);
          File dest = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC + "/" + audioFile + ".mp3");
          Uri r = Uri.fromFile(dest);         
          Intent viewMediaIntent = new Intent();   
          viewMediaIntent.setAction(android.content.Intent.ACTION_VIEW);                                 
          viewMediaIntent.setDataAndType(r, "audio/*");   
          viewMediaIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);          
          Intent i = Intent.createChooser(viewMediaIntent, "Play Music");
            mGap.startActivity(i);

      }

      public void playVideo(String movieurl){
          Intent intentToPlayVideo = new Intent(Intent.ACTION_VIEW);
          intentToPlayVideo.setDataAndType(Uri.parse(movieurl), "video/*");
          Log.d(TAG,"Playing:" + movieurl);
          mGap.startActivity(intentToPlayVideo);
      }
4

4 に答える 4

4

MediaPlayerを直接使用しない理由は何ですか?リソースIDを直接渡すことができます

int resourceId = R.raw.your_media_resource;
MediaPlayer mediaPlayer = MediaPlayer.create( context, resourceId );
mediaPlayer.setOnCompletionListener( new OnCompletionListener()
{
    @Override
    public void onCompletion( MediaPlayer mp )
    {
        mp.release();
    }
} );
mediaPlayer.start();
于 2013-01-24T15:55:00.983 に答える
3

に電話するとstartActivity()、アクティビティを開始しようとしています。Intentに渡すstartActivity()は、開始するアクティビティ(または利用可能な一連のアクティビティからの選択)を示します。あなたの場合、あなたはを表示しようとしていますandroid.resource:// Uri。これはhttp:// Uri、、、、またはではありませhttps:// Urifile:// Uri

このような支援活動として自らを宣伝する活動は、彼らがどのようなスキームを支援する<intent-filter>かについての声明の中にあります。Uriユーザーのデバイス上に、android.resource://スキームをサポートするアプリがあると想定しています。個人的には、これは安全な仮定ではないと思います。 http://、、、https://およびfile://は安全である必要があり、content://(の場合ContentProvider)もかなり可能性があります。

たとえば、AOSP Musicアプリは、現在のマニフェストコンテンツandroid.resourceに基づいて、このスキームをサポートしていません。

于 2013-01-24T16:07:33.580 に答える
0

アプリの外部でRESフォルダーのコンテンツを使用することはできません。コンテンツはアプリ内にあり、アプリ外からはアクセスできません。コンテンツを利用可能にしたい場合は、データを返す独自のContentProviderを実装する必要があります。

@CommonsWareは正しいです。http://iserveandroid.blogspot.nl/2011/01/how-to-access-resources-from-other.htmlを参照してください

于 2013-01-24T15:56:56.643 に答える
0

Notification.BuilderでサウンドURIを設定する必要があるだけの場合は、

 Uri.parse("android.resource://com.my.great.application/"
                        + R.raw.mysound);

ここで、rawresourcesフォルダーのR.raw.mysoundようなものにすることができます。mysoud.ogg

ただし、MP3が正確にサポートされているかどうかはわかりません。これらはアプリケーションの内部リソースにすぎないため、OGGに変換してみてください。

于 2013-01-24T15:58:47.603 に答える