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的小例子,标记为红色的代码总是报空指针的错误,望高手指教!!!,多谢。
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的小例子,标记为红色的代码总是报空指针的错误,望高手指教!!!,多谢。
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);楼主试试吧
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);
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);