0

コンテンツ/タイプ: audio/AACPのストリームShoutcastをバックグラウンドで実行する方法を探しています。現在、ライブラリaacdecoder-androidを使用して実行ストリームを取得していますが、サービスを使用してストリームをバックグラウンドに残す方法がわかりません。誰かがそのようなものを使用しましたか?

コード:

主な活動:

public class MainActivity extends Activity {
    public AACPlayer mp;
    private Toast myToast;
    private Handler mHandler;
    private ImageParser mImageParser;

    private WebView publicidadecapa;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add("Sair");
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getTitle().toString() == "Sair") {
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maintab);       

        mp = new AACPlayer(new RadioCallBack(this));                
        ProgressBar loading = (ProgressBar) findViewById(R.id.loadingAudio);
        loading.setVisibility(View.INVISIBLE);
        ImageView playButton = (ImageView) findViewById(R.id.playButton);
        playButton.setTag("1");
        playButton.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                ImageView playButton = (ImageView) arg0;
                ConnectivityManager cm =
                        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

                if ( cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnectedOrConnecting() ) {
                    if (myToast == null) {
                        myToast = Toast.makeText(getBaseContext(), "Verifique a conexão com a internet", 5000);
                    }
                    myToast.setDuration(5000);
                    myToast.show();
                    return;
                }

                if (playButton.getTag() == "1" && cm.getActiveNetworkInfo().isConnectedOrConnecting() ) {

                    playButton.setImageResource(R.drawable.btn_menustop);
                    playButton.setTag("0");
                    playButton.setVisibility(View.INVISIBLE);
                    ProgressBar loading = (ProgressBar) findViewById(R.id.loadingAudio);
                    loading.setVisibility(View.VISIBLE);
                    ((TextView)findViewById(R.id.textView1)).setText("Conectando...");


                    mp.playAsync( "http://voxsc1.somafm.com:9002/" );

                } else if ( playButton.getTag() == "0" ) {                  

                    playButton.setVisibility(View.INVISIBLE);
                    ProgressBar loading = (ProgressBar) findViewById(R.id.loadingAudio);
                    loading.setVisibility(View.VISIBLE);
                    playButton.setImageResource(R.drawable.btn_menuplay);
                    playButton.setTag("1");

                    mp.stop();
                }                                               

            }           
        });        

        final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);        

        SeekBar volumeControl = (SeekBar) findViewById(R.id.volumeControl);
        volumeControl.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
        volumeControl.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
        volumeControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            public void onStopTrackingTouch(SeekBar arg0) {


            }

            public void onStartTrackingTouch(SeekBar arg0) {


            }

            public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, arg1,0);
                if(arg1 == 0) {
                    ((ImageView) findViewById(R.id.imageView2)).setImageResource(R.drawable.ic_volume2);
                } else {
                    ((ImageView) findViewById(R.id.imageView2)).setImageResource(R.drawable.ic_volume1);
                }
            }
        });        
    }

    @Override
    public void onStop() {
        super.onStop();

    }
    @Override
    protected void onDestroy() {
        if (this.isFinishing()) {
            //mp.stop();
        }
        super.onDestroy();
    }

    public void onStart()
    {
        super.onStart();

        // your code
    }


    public Object fetch(String address) throws MalformedURLException,IOException {
        URL url = new URL(address);
        Object content = url.getContent();
        return content;
    }


    private Boolean isOnline()  {
        ConnectivityManager cm = 
                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if(ni != null && ni.isConnected())
            return true;

        return false;
    }

    /* Abrir em uma nova aba o link da publicidade */
    public class MyWebClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            //Uri uri = Uri.parse(url);
            Context context = view.getContext();
            Intent intent = new Intent(context,OpenSiteWebView.class);

            Bundle parametros = new Bundle();
            parametros.putString("url", url);

            intent.putExtras(parametros);

            startActivity(intent);
            return true;
        }
    }
}

RadioCallBack:

public class RadioCallBack implements PlayerCallback {

    private MainActivity activity;

    public RadioCallBack(MainActivity activity) {
        super();
        this.activity = activity;
    }

    public void playerException(Throwable arg0) {
        activity.runOnUiThread(new Runnable()  {                    
            public void run() {
                Toast.makeText(activity, "O stream pode estar offline! Tente novamente mais tarde", 50000).show();

                ProgressBar loading = (ProgressBar) activity.findViewById(R.id.loadingAudio);
                loading.setVisibility(View.INVISIBLE);
                ImageView playButton = (ImageView) activity.findViewById(R.id.playButton);
                playButton.setVisibility(View.VISIBLE);
                playButton.setImageResource(R.drawable.btn_menuplay);
                playButton.setTag("1");
                ((TextView)activity.findViewById(R.id.textView1)).setText("Pressione PLAY para tocar!");
            }
        });
    }

    public void playerPCMFeedBuffer(boolean arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub

    }

    public void playerStarted() {
        activity.runOnUiThread(new Runnable()  {            
            public void run() {
                ProgressBar loading = (ProgressBar) activity.findViewById(R.id.loadingAudio);
                loading.setVisibility(View.INVISIBLE);
                ImageView playButton = (ImageView) activity.findViewById(R.id.playButton);
                playButton.setVisibility(View.VISIBLE);
                ((TextView)activity.findViewById(R.id.textView1)).setText("Mais música brasileira");
            }           
        });     
    }

    public void playerStopped(int arg0) {
        activity.runOnUiThread(new Runnable()  {            
            public void run() {
                activity.mp = null;
                activity.mp = new AACPlayer(new RadioCallBack(activity));
                ProgressBar loading = (ProgressBar) activity.findViewById(R.id.loadingAudio);
                loading.setVisibility(View.INVISIBLE);
                ImageView playButton = (ImageView) activity.findViewById(R.id.playButton);
                playButton.setVisibility(View.VISIBLE);
                ((TextView)activity.findViewById(R.id.textView1)).setText("Pressione PLAY para tocar!");
            }           
        }); 
    }
}
4

2 に答える 2

0

「サービスを使用する」 - 右: Android サービスは、アプリケーション コンポーネントに追加の実行権限を付与し、コンポーネントがタスク スタックの最上位にない場合や、アプリケーションが終了した場合でも、コンポーネントを永続化できるようにします。ほとんどの場合、これらの重大なリソース不足の状況を除いて、システムが干渉してサービスを停止することはないため、それを制御する方法はユーザー次第です。

具体的には、バックグラウンド再生機能を備えたプレーヤーの構築に関する公式サイトの記事があります。しかし、彼らは MediaPlayer について話していますが、同じ原則がどのカスタム プレーヤーにも当てはまると私は信じています。

幸運を。

于 2012-10-07T11:42:08.737 に答える
0

音楽プレーヤーをバックグラウンドで実行するには、バックグラウンド サービスを作成する必要があります。

まず、サービスを開始する必要があります。次に、Service の onCreate() メソッドで MultiPlayer オブジェクトを初期化します。

次に、UI アクティビティ (マルチプレイヤー UI を持つ) に ServiceConnection を実装します。これにより、UI アクティビティがバックグラウンド サービスに接続されます。これで、バックグラウンド サービスとマルチプレイヤー オブジェクトの再生、一時停止機能などを制御できるようになりました。ServiceConnectionの実装についてはこちらを参照してください。

ユーザーが通知バーの通知をクリックして ui に戻るようにする場合は、 serviceForgroundを作成することもできます。

お役に立てれば

于 2013-04-20T13:33:53.843 に答える