package com.huo;import android.app.ListActivity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
/**
 *<br>Description:接收广播 、绑定服务、实现各控件的功能
 **/
public class MusicPlayerActivity extends ListActivity {

private Button play_pause_btn;
private Button stop_btn;
private MusicPlayerService musicPlayerService;
private MusicInfoController musicInfoController;
private Cursor mCursor;
private TextView mTextView;
    /** Called when the activity is first created. */

BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action == MusicPlayerService.PLAYBACK_COMPLETION) {
play_pause_btn.setText(R.string.playback);

if (action == MusicPlayerService.PLAYBACK_PREPARED) {
play_pause_btn.setVisibility(View.VISIBLE);
play_pause_btn.setText(R.string.playback);
stop_btn.setVisibility(View.VISIBLE);
stop_btn.setText(R.string.stop);
}
}
};

ServiceConnection conn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
musicPlayerService = null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
 musicPlayerService = ((MusicPlayerService.LocalBinder)service).getService();
}
};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mTextView = (TextView) findViewById(R.id.click_to_play);
        MusicPlayerApp app = (MusicPlayerApp)getApplication();
        musicInfoController = app.getMusicInfoController();

        
        play_pause_btn = (Button) findViewById(R.id.Button01);
        play_pause_btn.setOnClickListener(new Button.OnClickListener(){ @Override
public void onClick(View v) {
if (musicPlayerService!= null && musicPlayerService.isPlaying()) {
musicPlayerService.pause();
play_pause_btn.setVisibility(View.VISIBLE);
play_pause_btn.setText(R.string.playback); }
else if (musicPlayerService!=null){
musicPlayerService.start();
play_pause_btn.setText(R.string.pause);
}
}        
        });
        stop_btn = (Button) findViewById(R.id.Button02);
        stop_btn.setOnClickListener(new Button.OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
mTextView.setVisibility(View.VISIBLE);
musicPlayerService.stop();
}
        
        });
        
        IntentFilter filter = new IntentFilter();
        filter.addAction(MusicPlayerService.PLAYBACK_COMPLETION);
        filter.addAction(MusicPlayerService.PLAYBACK_PREPARED);
        //The receiver will be called with any broadcast Intent that matches filter, 
        //in the main application thread. 
        registerReceiver(receiver, filter);
        
        //A service can be both started and have connections bound to it
        startService(new Intent(this,MusicPlayerService.class));
        bindService(new Intent(this,MusicPlayerService.class), conn, BIND_AUTO_CREATE);
        
    } @Override
protected void onResume() {
super.onResume();
mCursor = musicInfoController.getAllSongs();
ListAdapter adapter = new MusicAdapter(this, 
android.R.layout.simple_expandable_list_item_2, mCursor, 
new String[]{},new int[]{});

setListAdapter(adapter);
}

public class MusicAdapter extends SimpleCursorAdapter{

public MusicAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
} @Override
public void bindView(View view, Context context, Cursor cursor) {
// TODO Auto-generated method stub
super.bindView(view, context, cursor);
/*注意此处的写法“android.R.id.text1”*/
TextView title = (TextView)findViewById(android.R.id.text1);
TextView artist = (TextView)findViewById(android.R.id.text2);
/*@see android.database.Cursor#getColumnIndexOrThrow (String columnName)*/
title.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)));
artist.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)));

}
}

/*@see android.app.ListAdapter#onListItemClick(ListView l, View v, int position, long id) 
*/
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
if (mCursor == null && mCursor.getCount()== 0) {
return;
}
mCursor.moveToPosition(position);
String url = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
musicPlayerService.setDataSource(url);
musicPlayerService.start();
}    
}
小弟写了个关于mp3的小例子,标记为红色的代码总是报空指针的错误,望高手指教!!!,多谢。

解决方案 »

  1.   

    TextView title = (TextView)findViewById(android.R.id.text1);
    TextView artist = (TextView)findViewById(android.R.id.text2);

    可能是这两句的问题呢TextView title = (TextView)view.findViewById(android.R.id.text1);
    TextView artist = (TextView)view.findViewById(android.R.id.text2);楼主试试吧
      

  2.   

    TextView title = (TextView)findViewById(android.R.id.text1);
    TextView artist = (TextView)findViewById(android.R.id.text2);
    这里出问题了!没能取到值!改为下面那个:TextView title = (TextView)view.findViewById(android.R.id.text1);
    TextView artist = (TextView)view.findViewById(android.R.id.text2);
      

  3.   

    cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)这句改成cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)试试Video是获取影片文件的,Audio才是获取音频文件的吧
      

  4.   

    如果是下面的错误:
    06-07 02:20:33.235: ERROR/AndroidRuntime(579): java.lang.NullPointerException06-07 02:20:33.235: ERROR/AndroidRuntime(579):     at android.widget.CursorAdapter.getView(CursorAdapter.java:186)通过跟踪发现的确如1楼所说,title 和artist 为null。需要修改成:
    extView title = (TextView)view.findViewById(android.R.id.text1);
    TextView artist = (TextView)view.findViewById(android.R.id.text2);