2011-02-07 28 views
2

携帯電話のどこかの場所(任意の場所)にファイルへの完全なパスを取得し、MediaPlayerで再生する必要があります。Android MediaPlayerファイルへのフルパス

Android用ファイルチューザーを使用して(インテントを起動して)聞いたことがあります。

テストコードで

、私はちょうど、別のファイルにリソースをコピーしたパスを持って、AudioVideoEntry(私は後に表示されて、MediaPlayerの周りに非常にシンプルで薄いラッパー)にそれを渡さ

ここではテストコードがあります私が書いた:

private String ave_path; 
    private String ave_file_name = "my_media_content"; 
    private InputStream ave_fis; 
    private OutputStream ave_fos; 
    public void testAudioVideoEntry() 
    { 
     //get the Activity 
     Module_JournalEntry journalentryactivity = getActivity(); 
     //open an InputStream to a resource file (in this case strokes.mp3) 
     ave_fis = journalentryactivity.getResources().openRawResource(module.jakway.JournalEntry.R.raw.strokes); 

     //open an OutputStream to a new file 
     try { 
      ave_fos = journalentryactivity.openFileOutput(ave_file_name, 
               Context.MODE_PRIVATE); 
     } catch (FileNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      assertTrue(false); 
     } 
     catch(Exception e) 
     { 
      assertTrue(false); 
     } 

     //copy the data from the resource into 
     //the OutputStream 
     int data; 
     try { 
     while((data = ave_fis.read()) != -1) 
     { 
      ave_fos.write(data); 
     } 
      assertTrue(true); 
     } 
     catch(Exception e) 
     { 
      assertTrue(false); 
     } 

     //get the full path of the file we wrote to 
     ave_path = journalentryactivity.getFileStreamPath(ave_file_name).toString(); 

     //and construct a new object of AudioVideoEntry with that path 
     AudioVideoEntry ave = new AudioVideoEntry(ave_path); 

     //register an error listener via MediaPlayer's setOnErrorListener 
     ave.setOnErrorListener(new OnErrorListener() 
           { 
            @Override 
            public boolean onError(MediaPlayer mp, 
              int what, int extra) { 
             Log.e("MEDIAPLAYER ERRORS", 
             "what: " + what + " extra: " + extra); 
             assertTrue(false); 
             // TODO Auto-generated method stub 
             return false; 
            } 
           }); 
     ave.prepareMedia(); 
     ave.playMedia(); 
     try { 
     ave_fis.close(); 
     ave_fos.close(); 
     } 
     catch(Exception e) 
     { 
      assertTrue(false); 
      e.printStackTrace(); 
     } 

AudioVideoEntryは、基本的には、独自のパスを保持することができMediaPlayerの薄いラッパです:

public class AudioVideoEntry 
{ 
    private String path_to_audio_file; 
    private MediaPlayer mediaplayer; 

    /** 
    * Initialize the internal MediaPlayer 
    * from the String parameter 
    * @param set_path_to_audio_file 
    */ 
    public AudioVideoEntry(String set_path_to_audio_file) 
    { 
     path_to_audio_file = set_path_to_audio_file; 
     mediaplayer = new MediaPlayer(); 
     try { 
      mediaplayer.setDataSource(path_to_audio_file); 
      mediaplayer.prepare(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public AudioVideoEntry(FileDescriptor fd) 
    { 

     mediaplayer = new MediaPlayer(); 
     try { 
      mediaplayer.setDataSource(fd); 
      mediaplayer.prepare(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 



    /** 
    * Begin playing media 
    */ 
    public void prepareMedia() 
    { 
     try { 
      mediaplayer.prepare(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * play media 
    * don't forget to prepare() if necessary 
    */ 
    public void playMedia() 
    { 
     mediaplayer.start(); 
    } 

    /** 
    * pause the media 
    * can be played later 
    */ 
    public void pauseMedia() 
    { 
     mediaplayer.pause(); 
    } 

    /** 
    * stop media 
    */ 
    public void stopMedia() 
    { 
     mediaplayer.stop(); 
    } 

    public void setOnErrorListener(OnErrorListener listener) 
    { 
     mediaplayer.setOnErrorListener(listener); 
    } 
} 

ここでlogcat出力fがありますROM JUnitテスト(テストが成功した、実際の結果 - logatが示すように - はありませんでした)

02-07 09:40:23.129: ERROR/MediaPlayer(1209): error (1, -2147483648) 
02-07 09:40:23.139: WARN/System.err(1209): java.io.IOException: Prepare failed.: status=0x1 
02-07 09:40:23.149: WARN/System.err(1209):  at android.media.MediaPlayer.prepare(Native Method) 
02-07 09:40:23.149: WARN/System.err(1209):  at module.jakway.JournalEntry.AudioVideoEntry.<init>(AudioVideoEntry.java:39) 
02-07 09:40:23.149: WARN/System.err(1209):  at module.jakway.JournalEntry.test.Module_JournalEntryTest.testAudioVideoEntry(Module_JournalEntryTest.java:182) 
02-07 09:40:23.149: WARN/System.err(1209):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-07 09:40:23.149: WARN/System.err(1209):  at java.lang.reflect.Method.invoke(Method.java:507) 
02-07 09:40:23.159: WARN/System.err(1209):  at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204) 
02-07 09:40:23.159: WARN/System.err(1209):  at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194) 
02-07 09:40:23.159: WARN/System.err(1209):  at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186) 
02-07 09:40:23.159: WARN/System.err(1209):  at junit.framework.TestCase.runBare(TestCase.java:127) 
02-07 09:40:23.169: WARN/System.err(1209):  at junit.framework.TestResult$1.protect(TestResult.java:106) 
02-07 09:40:23.169: WARN/System.err(1209):  at junit.framework.TestResult.runProtected(TestResult.java:124) 
02-07 09:40:23.169: WARN/System.err(1209):  at junit.framework.TestResult.run(TestResult.java:109) 
02-07 09:40:23.179: WARN/System.err(1209):  at junit.framework.TestCase.run(TestCase.java:118) 
02-07 09:40:23.179: WARN/System.err(1209):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
02-07 09:40:23.179: WARN/System.err(1209):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
02-07 09:40:23.179: WARN/System.err(1209):  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 
02-07 09:40:23.189: WARN/System.err(1209):  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447) 
02-07 09:40:23.189: ERROR/MediaPlayer(1209): prepareAsync called in state 0 
02-07 09:40:23.189: WARN/System.err(1209): java.lang.IllegalStateException 
02-07 09:40:23.189: WARN/System.err(1209):  at android.media.MediaPlayer.prepare(Native Method) 
02-07 09:40:23.189: WARN/System.err(1209):  at module.jakway.JournalEntry.AudioVideoEntry.prepareMedia(AudioVideoEntry.java:79) 
02-07 09:40:23.199: WARN/System.err(1209):  at module.jakway.JournalEntry.test.Module_JournalEntryTest.testAudioVideoEntry(Module_JournalEntryTest.java:197) 
02-07 09:40:23.199: WARN/System.err(1209):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-07 09:40:23.199: WARN/System.err(1209):  at java.lang.reflect.Method.invoke(Method.java:507) 
02-07 09:40:23.199: WARN/System.err(1209):  at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204) 
02-07 09:40:23.199: WARN/System.err(1209):  at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194) 
02-07 09:40:23.199: WARN/System.err(1209):  at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186) 
02-07 09:40:23.199: WARN/System.err(1209):  at junit.framework.TestCase.runBare(TestCase.java:127) 
02-07 09:40:23.199: WARN/System.err(1209):  at junit.framework.TestResult$1.protect(TestResult.java:106) 
02-07 09:40:23.199: WARN/System.err(1209):  at junit.framework.TestResult.runProtected(TestResult.java:124) 
02-07 09:40:23.199: WARN/System.err(1209):  at junit.framework.TestResult.run(TestResult.java:109) 
02-07 09:40:23.199: WARN/System.err(1209):  at junit.framework.TestCase.run(TestCase.java:118) 
02-07 09:40:23.199: WARN/System.err(1209):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
02-07 09:40:23.199: WARN/System.err(1209):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
02-07 09:40:23.199: WARN/System.err(1209):  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 
02-07 09:40:23.199: WARN/System.err(1209):  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447) 
02-07 09:40:23.199: ERROR/MediaPlayer(1209): start called in state 0 
02-07 09:40:23.199: ERROR/MediaPlayer(1209): error (-38, 0) 

編集:なぜMediaPlayerのは失敗していますか?

ありがとうございました!

+0

どこかに質問がある場合、私はそれを見ていません... – androidworkz

+0

なぜ私はエラーが発生していますか? – Prime

答えて

11

AudioVideoEntry.prepareMedia()メソッドのMediaPlayer.prepare()(既にAudioVideoEntry ctorで1回呼び出されています)の2回目の呼び出しは、他の人が気付いたように簡単に見つけることができました。

見つけにくいエラーは最初のエラーです。

テスト用にOggファイルを使用しました。

最初の手がかりは限りファイルは.OGG拡張子を持っているとして、彼らは内蔵の音楽プレーヤー で果たすべきandroid-platform - Ogg on G1

に(最後の1)を返信davidsparksからでした。 メディアスキャナ用の集中ファイルレコグナイザがないため、ファイル拡張子に依存しています。

第二の手掛かりが原因Androidのセキュリティモデルに[android-developers] Re: File permission about MediaPlayer

からだった、MediaPlayerのはルート アクセス権を持っていません。それはsdcardにアクセスできますが、プライベート アプリディレクトリにアクセスすることはできません。

アプリは、明示的にファイルを開いて、setDataSource(ファイル記述子fdの)メソッドを使用して MediaPlayerのにファイル記述子を渡すことによって ファイルを確保するためのMediaPlayerの一時的なアクセス権を付与することができます。

出力ストリームの絶対パスを見ると、アプリケーションのパッケージ名のディレクトリの/data/dataディレクトリにあることがわかります。

タイムスタンプを間違えて - 私はOS2.1update1(API7)エミュレータで表示するデータを取得するために後方に作業しました。

あなたのコードを持っていた:

String ave_file_name = "my_media_content"; 

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_PRIVATE); 

DDMSは示した:

02-10 05:10:28.253: WARN/MediaPlayer(1992): info/warning (1, 26) 
02-10 05:10:28.253: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported 
02-10 05:10:28.253: ERROR/MediaPlayer(1992): error (1, -4) 
02-10 05:10:28.274: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete 

を我々はMODE_WORLD_READABLEにJUSTファイルを変更した場合:

String ave_file_name = "my_media_content"; 

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_WORLD_READABLE); 

DDMSは何の改善を示しています

02-10 05:08:28.543: WARN/MediaPlayer(1900): info/warning (1, 26) 
02-10 05:08:28.553: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported 
02-10 05:08:28.553: ERROR/MediaPlayer(1900): error (1, -4) 
02-10 05:08:28.563: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete 

我々はoggJUSTファイル拡張子を変更した場合:

02-10 04:59:30.153: ERROR/MediaPlayerService(31): error: -2 
02-10 04:59:30.163: ERROR/MediaPlayer(1603): Unable to to create media player 

しかし、我々は2を組み合わせ

String ave_file_name = "my_media_content.ogg"; 

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_PRIVATE); 

を私たちは、DDMS出力の変化を取得します

String ave_file_name = "my_media_content.ogg"; 

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_WORLD_READABLE); 

DDMSにエラーはありません。

+0

ありがとう!あなたはその恩恵のすべてのビットに値する – Prime

0

dragonwrenn IllegalStateExceptionを与えている理由です、あなたが最初AudioVideoEntryのコンストラクタで、二回prepare()を呼び出し、メソッドprepareMedia()第二されているようです。

慎重にdocumentationを読んだら、状態図を理解することができます。なぜそのような例外が発生するのですか?

+0

これはprepareAsyncエラーを説明しています。 AVEコンストラクタにはまだ最初の準備エラーがあります。 –

3

いくつかのポイント:

  1. は二回(一回コンストラクタと明示的に他で)prepare()を呼び出さないでください。それはIllegalStateExceptionがスローされた理由の1つかもしれません。
  2. また、アプリケーション内で再生しようとしているファイルはありますか?もしそうなら、なぜストリームを作成しようとしていますか?ファイルは、アプリケーション内ですでにある(と/res/raw以内ならば、あなたはそうのようなメディアプレーヤオブジェクトを作成することにより、prepare()を使用しての面倒を自分で試してみて、救うことができる:

    メディアプレーヤ=新しいMediaPlayer.create(これ、R.raw.resourceここ-name);。

作成機能がprepare()内を呼び出し
3. MediaPlayerの中のステージのいずれかがエラーを入力MediaPlayerのオブジェクトにその結果失敗した場合にも、reset()機能を試してみて、使用することができます0を返します。reset()を使用すると、アイドル状態に戻ります。
4.最後に私がこのエラーstatus=0x1メッセージを受け取ったとき、ファイル(マニフェストの外部記憶装置など)と不正なフォルダに置かれたファイルの正しいアクセス権が設定されていないことが判明しました。また、それを見てみたいかもしれません。

動作しない場合はお知らせください。
私たちは何かを試すことができます。
Sriram。

関連する問題