2015-04-01 68 views
-1

首先,我按照本教程制作了音乐播放器应用程序。 http://www.java2s.com/Code/Android/Media/UsingServicetoplaymediafile.htm无法将数据从活动传递到服务

该应用程序工作正常。之后,我修改了代码以发送从MainActivityService的链接,以便服务中的MediaPlayer可以从链接流式传输音频。现在该应用程序无法正常工作。当我点击“开始播放”按钮时,应用程序崩溃。我在Manifest文件中添加了Internet权限。以下是我的代码。

MainActivity.java

package com.example.musicplayer; 

import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.support.v7.app.ActionBarActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 


public class MainActivity extends Activity implements OnClickListener { 

     Button startPlaybackButton, stopPlaybackButton; 
     Intent playbackServiceIntent; 

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

     startPlaybackButton = (Button) this.findViewById(R.id.StartPlaybackButton); 
     stopPlaybackButton = (Button) this.findViewById(R.id.StopPlaybackButton); 

     startPlaybackButton.setOnClickListener(this); 
     stopPlaybackButton.setOnClickListener(this); 

     playbackServiceIntent = new Intent(this, BackgroundAudioService.class); 
     } 

     public void onClick(View v) { 
     if (v == startPlaybackButton) { 

      playbackServiceIntent.putExtra("song_link", "http://a2z3gp.com/Telugump3%20Songs/Telugump3/A%20TO%20Z%20TELUGU%20HQ%20MP3%20SONGS/E/Eduruleni%20Manishi/Are_Eelakotti.mp3"); 
      startService(playbackServiceIntent); 

     } else if (v == stopPlaybackButton) { 

      stopService(playbackServiceIntent); 

     } 
     } 
    } 

BackgroundAudioService.java

package com.example.musicplayer; 
import java.io.IOException; 

import android.app.Service; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.os.IBinder; 

public class BackgroundAudioService extends Service implements OnCompletionListener { 
    MediaPlayer mediaPlayer; 
    String data; 

    @Override 
    public IBinder onBind(Intent intent) { 
    return null; 
    } 

    @Override 
    public void onCreate() { 

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mediaPlayer.setOnCompletionListener(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     data=(String) intent.getExtras().get("song_link"); 
     try { 
     mediaPlayer.setDataSource(data); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException 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(); 
    } 

    if (!mediaPlayer.isPlaying()) { 
     mediaPlayer.start(); 
    } 
    return START_STICKY; 
    } 

    public void onDestroy() { 
    if (mediaPlayer.isPlaying()) { 
     mediaPlayer.stop(); 
    } 
    mediaPlayer.release(); 
    } 

    public void onCompletion(MediaPlayer _mediaPlayer) { 
    stopSelf(); 
    } 

} 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Background Audio Player" 
     /> 
    <Button android:text="Start Playback" android:id="@+id/StartPlaybackButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
    <Button android:text="Stop Playback" android:id="@+id/StopPlaybackButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
</LinearLayout> 
+0

为了传递数据从活动到服务,您需要将您的活动与服务绑定。请参考这个http://developer.android.com/guide/components/bound-services.html – 2015-04-01 09:53:43

+0

创建原始文件夹,并在原始文件夹添加歌曲比给原始文件夹路径 – 2015-04-01 09:55:26

+0

但我想从互联网流音频文件@JATIN DEVANI – 2015-04-01 10:03:21

回答

0

请更换代码

@Override 
    public void onCreate() { 

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mediaPlayer.setOnCompletionListener(this); 
    } 

@Override 
    public void onCreate() 
    { 
     mediaPlayer = new MediaPlayer(); 
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mediaPlayer.setOnCompletionListener(this); 
    } 

而且在mediaPlaye之前添加下面的行r.start();在线服务。

mediaPlayer.prepare(); 
+0

工作先生,非常感谢! – 2015-04-01 11:22:39

0

首先,您的MediaPlayer没有初始化,因此崩溃。

这里试试这个:

package com.example.musicplayer; 
    import java.io.IOException; 

    import android.app.Service; 
    import android.content.Intent; 
    import android.media.AudioManager; 
    import android.media.MediaPlayer; 
    import android.media.MediaPlayer.OnCompletionListener; 
    import android.os.Bundle; 
    import android.os.IBinder; 

    public class BackgroundAudioService extends Service implements OnCompletionListener { 
     MediaPlayer mediaPlayer; 
     String data; 

     @Override 
     public IBinder onBind(Intent intent) { 
     return null; 
     } 

     @Override 
     public void onCreate() { 

     } 
private void initMedia(String data) { 
     mediaPlayer= MediaPlayer.create(BackgroundAudioService.this, Uri.parse(data)); 
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mediaPlayer.setOnCompletionListener(this); 
    } 



     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent == null || intent.getExtras() == null) // because this will    //start also first time you run the service even with no extras 
     return; 

      data=(String) intent.getExtras().get("song_link"); 
      if(mediaPlayer ==null) 
      initMedia(data); 
     else { 
      mediaPlayer.setDataSource(data); 
     } 
     if (!mediaPlayer.isPlaying()) { 
      mediaPlayer.start(); 
     } 
     return START_STICKY; 
     } 

     public void onDestroy() { 
     if (mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
     } 
     mediaPlayer.release(); 
     } 

     public void onCompletion(MediaPlayer _mediaPlayer) { 
     stopSelf(); 
     } 

    } 

PS没有尝试,但它只是一个指南;)

+0

不工作... :( – 2015-04-01 11:19:41