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();
}
}