2

Android、ストリーミング、Media Player に関連する奇妙な問題に直面しています。

実際のアプリは非常に複雑ですが、可能な限り単純なテスト ケースを用意しました。「Hello, World」アクティビティは、ハードコードされた URL でメディア プレーヤーを起動します。これは、API レベル 7 (実際のアプリの最小値) と API レベル 17 の両方の Android エミュレーターで正常に動作します。ただし、API レベル 15 のハードウェア デバイスでは同じアプリが失敗します - 準備() 呼び出し中にメディア プレーヤーが失敗します。 :

  • ブロッキングの prepare() を使用すると、IOException で失敗します
  • ノンブロッキングの prepareAsync() を使用すると失敗し、onErrorListener がトリガーされます (例外は発生しません)。

障害は常に (ブロッキングおよび非ブロッキング準備) に「エラー (1,-2147483648)」と表示されます。Media Player ドキュメントには、そのようなエラー コード -2147483648 (0xffffffff) はありません。

アプリにはインターネットにアクセスするための適切な権限 (android.permission.INTERNET) があり、デバイスのインターネット接続が機能しています (同じアプリがインターネットからファイルをダウンロードできます)。

これはコーデックの問題ではありません。同じストリームをエミュレータで再生でき、他のストリームはハードウェア デバイスで同じように失敗するためです。

他にも多くのことを試しましたが、どれも役に立ちませんでした:

  • pepareAsync() と onPreparedListener を使用して start() を呼び出す
  • Media Player で reset() を呼び出す
  • Uri.parse() によるデータ ソースの設定
  • オーディオ マネージャーからのオーディオ フォーカスの取得

ハードウェアは正常に動作しており、同じデバイスで Android 内蔵のデフォルト オーディオ プレーヤー アプリを使用してストレージからオーディオ ファイルを再生できます。

私は幽霊のことを (あまり) 信じていませんが、他に選択肢がありません。このようなものを見た人はいますか?アプリはエミュレーターで動作しますが、ハードウェアでは動作しませんか?

誰でもハードウェア デバイスでこのコードを試してもらえますか (Android デバイスは 1 つしかありません)。

public class MainActivity extends Activity {

private MediaPlayer mediaPlayer;
private String listen_url = "http://stream15.top-ix.org:80/radiojukebox-low";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mediaPlayer = new MediaPlayer();
    //mediaPlayer.reset();

    try {
        mediaPlayer.setDataSource(listen_url);
        //mediaPlayer.setDataSource(this, Uri.parse(listen_url));
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
                    // We fail here!
        e.printStackTrace();
    }

    mediaPlayer.start();
}
}
4

1 に答える 1

0

これは通常、使用しているデバイスでストリームタイプがサポートされていないためです。簡単なMP3ストリームを試しましたか?

于 2013-03-06T20:22:19.580 に答える