致命的异常

时间:2014-06-05 02:51:08

标签: android android-layout runtime-error illegalstateexception

这是我的logcat

     MediaPlayer(5424): Uri is  content://media/external/audio/media/2325
                MediaPlayer(5424): http youtube = false, scheme = content
                MediaPlayer(5424): Uri is  content://media/internal/audio/media/2325
                MediaPlayer(5424): http youtube = false, scheme = content
                MediaPlayer(5424): Couldn't open file on client side, trying server side
                MediaPlayer(5424): attachNewPlayer called in state 2
                MUSIC SERVICE(5424): Error setting data source
                MUSIC SERVICE(5424): java.lang.IllegalStateException
                MUSIC SERVICE(5424):    at android.media.MediaPlayer._setDataSource(Native Method)
                MUSIC SERVICE(5424):    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:981)
                MUSIC SERVICE(5424):    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:966)
                MUSIC SERVICE(5424):    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:878)
                MUSIC SERVICE(5424):    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:812)
                MUSIC SERVICE(5424):    at com.playmusic.ghufron.MusicService.playSong(MusicService.java:109)
                MUSIC SERVICE(5424):    at com.playmusic.ghufron.MainActivity.songPicked(MainActivity.java:105)
                MUSIC SERVICE(5424):    at java.lang.reflect.Method.invokeNative(Native Method)
                MUSIC SERVICE(5424):    at java.lang.reflect.Method.invoke(Method.java:511)
                MUSIC SERVICE(5424):    at android.view.View$1.onClick(View.java:3052)
                MUSIC SERVICE(5424):    at android.view.View.performClick(View.java:3528)
                MUSIC SERVICE(5424):    at android.view.View$PerformClick.run(View.java:14235)
                MUSIC SERVICE(5424):    at android.os.Handler.handleCallback(Handler.java:605)
                MUSIC SERVICE(5424):    at android.os.Handler.dispatchMessage(Handler.java:92)
                MUSIC SERVICE(5424):    at android.os.Looper.loop(Looper.java:137)
                MUSIC SERVICE(5424):    at android.app.ActivityThread.main(ActivityThread.java:4424)
                MUSIC SERVICE(5424):    at java.lang.reflect.Method.invokeNative(Native Method)
                MUSIC SERVICE(5424):    at java.lang.reflect.Method.invoke(Method.java:511)
                MUSIC SERVICE(5424):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
                MUSIC SERVICE(5424):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
                MUSIC SERVICE(5424):    at dalvik.system.NativeStart.main(Native Method)
                dalvikvm(5424): threadid=1: thread exiting with uncaught exception (group=0x40af89f0)
                AndroidRuntime(5424): FATAL EXCEPTION: main
                AndroidRuntime(5424): java.lang.NoSuchMethodError: android.app.Notification$Builder.build
                AndroidRuntime(5424):   at com.playmusic.ghufron.MusicService.onPrepared(MusicService.java:156)
                AndroidRuntime(5424):   at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1758)
                AndroidRuntime(5424):   at android.os.Handler.dispatchMessage(Handler.java:99)
                AndroidRuntime(5424):   at android.os.Looper.loop(Looper.java:137)
                AndroidRuntime(5424):   at android.app.ActivityThread.main(ActivityThread.java:4424)
                AndroidRuntime(5424):   at java.lang.reflect.Method.invokeNative(Native Method)
                AndroidRuntime(5424):   at java.lang.reflect.Method.invoke(Method.java:511)
                AndroidRuntime(5424):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
                AndroidRuntime(5424):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
                AndroidRuntime(5424):   at dalvik.system.NativeStart.main(Native Method)
                dalvikvm(5653): VFY: unable to resolve virtual method 163: Landroid/app/Notification$Builder;.build ()Landroid/app/Notification;
  1. 这里是我的主要活动java

            package com.playmusic.ghufron;
    
            import java.util.ArrayList;
            import java.util.Collections;
            import java.util.Comparator;
    
            import com.playmusic.ghufron.MusicService.MusicBinder;
    
    
    
            import android.net.Uri;
            import android.os.Bundle;
            import android.os.IBinder;
            import android.app.Activity;
            import android.content.ComponentName;
            import android.content.ContentResolver;
            import android.content.Context;
            import android.content.Intent;
            import android.content.ServiceConnection;
            import android.database.Cursor;
            import android.view.Menu;
            import android.view.MenuItem;
            import android.view.View;
            import android.widget.ListView;
            import android.widget.MediaController.MediaPlayerControl;
    
    
    
            public class MainActivity extends Activity implements MediaPlayerControl {
    
                //song list variables
                private ArrayList<Song> songList;
                private ListView songView;
    
                //service
                private MusicService musicSrv;
                private Intent playIntent;
                //binding
                private boolean musicBound=false;
    
                //controller
                private MusicController controller;
    
                //activity and playback pause flags
                private boolean paused=false, playbackPaused=false;
    
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
    
                    //retrieve list view
                    songView = (ListView)findViewById(R.id.song_list);
                    //instantiate list
                    songList = new ArrayList<Song>();
                    //get songs from device
                    getSongList();
                    //sort alphabetically by title
                    Collections.sort(songList, new Comparator<Song>(){
                        public int compare(Song a, Song b){
                            return a.getTitle().compareTo(b.getTitle());
                        }
                    });
                    //create and set adapter
                    SongAdapter songAdt = new SongAdapter(this, songList);
                    songView.setAdapter(songAdt);
    
                    //setup controller
                    setController();
                }
    
                //connect to the service
                private ServiceConnection musicConnection = new ServiceConnection(){
    
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
                        MusicBinder binder = (MusicBinder)service;
                        //get service
                        musicSrv = binder.getService();
                        //pass list
                        musicSrv.setList(songList);
                        musicBound = true;
                    }
    
                    @Override
                    public void onServiceDisconnected(ComponentName name) {
                        musicBound = false;
                    }
                };
    
                //start and bind the service when the activity starts
                @Override
                protected void onStart() {
                    super.onStart();
                    if(playIntent==null){
                        playIntent = new Intent(this, MusicService.class);
                        bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
                        startService(playIntent);
                    }
                }
    
                //user song select
                public void songPicked(View view){
                    musicSrv.setSong(Integer.parseInt(view.getTag().toString()));
                    musicSrv.playSong();
                    if(playbackPaused){
                        setController();
                        playbackPaused=false;
                    }
                    controller.show(0);
                }
    
                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    // Inflate the menu; this adds items to the action bar if it is present.
                    getMenuInflater().inflate(R.menu.main, menu);
                    return true;
                }
    
                @Override
                public boolean onOptionsItemSelected(MenuItem item) {
                    //menu item selected
                    switch (item.getItemId()) {
                    case R.id.action_shuffle:
                        musicSrv.setShuffle();
                        break;
                    case R.id.action_end:
                        stopService(playIntent);
                        musicSrv=null;
                        System.exit(0);
                        break;
                    }
                    return super.onOptionsItemSelected(item);
                }
    
                //method to retrieve song info from device
                public void getSongList(){
                    //query external audio
                    ContentResolver musicResolver = getContentResolver();
                    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
                    //iterate over results if valid
                    if(musicCursor!=null && musicCursor.moveToFirst()){
                        //get columns
                        int titleColumn = musicCursor.getColumnIndex
                                (android.provider.MediaStore.Audio.Media.TITLE);
                        int idColumn = musicCursor.getColumnIndex
                                (android.provider.MediaStore.Audio.Media._ID);
                        int artistColumn = musicCursor.getColumnIndex
                                (android.provider.MediaStore.Audio.Media.ARTIST);
                        //add songs to list
                        do {
                            long thisId = musicCursor.getLong(idColumn);
                            String thisTitle = musicCursor.getString(titleColumn);
                            String thisArtist = musicCursor.getString(artistColumn);
                            songList.add(new Song(thisId, thisTitle, thisArtist));
                        } 
                        while (musicCursor.moveToNext());
                    }
                }
    
                @Override
                public boolean canPause() {
                    return true;
                }
    
                @Override
                public boolean canSeekBackward() {
                    return true;
                }
    
                @Override
                public boolean canSeekForward() {
                    return true;
                }
    
                @Override
                public int getAudioSessionId() {
                    return 0;
                }
    
                @Override
                public int getBufferPercentage() {
                    return 0;
                }
    
                @Override
                public int getCurrentPosition() {
                    if(musicSrv!=null && musicBound && musicSrv.isPng())
                        return musicSrv.getPosn();
                    else return 0;
                }
    
                @Override
                public int getDuration() {
                    if(musicSrv!=null && musicBound && musicSrv.isPng())
                        return musicSrv.getDur();
                    else return 0;
                }
    
                @Override
                public boolean isPlaying() {
                    if(musicSrv!=null && musicBound)
                        return musicSrv.isPng();
                    return false;
                }
    
                @Override
                public void pause() {
                    playbackPaused=true;
                    musicSrv.pausePlayer();
                }
    
                @Override
                public void seekTo(int pos) {
                    musicSrv.seek(pos);
                }
    
                @Override
                public void start() {
                    musicSrv.go();
                }
    
                //set the controller up
                private void setController(){
                    controller = new MusicController(this);
                    //set previous and next button listeners
                    controller.setPrevNextListeners(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            playNext();
                        }
                    }, new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            playPrev();
                        }
                    });
                    //set and show
                    controller.setMediaPlayer(this);
                    controller.setAnchorView(findViewById(R.id.song_list));
                    controller.setEnabled(true);
                }
    
                private void playNext(){
                    musicSrv.playNext();
                    if(playbackPaused){ 
                        setController();
                        playbackPaused=false;
                    }
                    controller.show(0);
                }
    
                private void playPrev(){
                    musicSrv.playPrev();
                    if(playbackPaused){
                        setController();
                        playbackPaused=false;
                    }
                    controller.show(0);
                }
    
                @Override
                protected void onPause(){
                    super.onPause();
                    paused=true;
                }
    
                @Override
                protected void onResume(){
                    super.onResume();
                    if(paused){
                        setController();
                        paused=false;
                    }
                }
    
                @Override
                protected void onStop() {
                    controller.hide();
                    super.onStop();
                }
    
                @Override
                protected void onDestroy() {
                    stopService(playIntent);
                    musicSrv=null;
                    super.onDestroy();
                }
    
            }
    
  2. 2.我的音乐服务

            package com.playmusic.ghufron;
    
            import java.util.ArrayList;
            import java.util.Random;
    
            import android.app.Notification;
            import android.app.PendingIntent;
            import android.app.Service;
            import android.content.ContentUris;
            import android.content.Intent;
            import android.media.AudioManager;
            import android.media.MediaPlayer;
            import android.net.Uri;
            import android.os.Binder;
            import android.os.IBinder;
            import android.os.PowerManager;
            import android.util.Log;
    
    
    
            public class MusicService extends Service implements 
            MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
            MediaPlayer.OnCompletionListener {
    
                //media player
                private MediaPlayer player;
                //song list
                private ArrayList<Song> songs;
                //current position
                private int songPosn;
                //binder
                private final IBinder musicBind = new MusicBinder();
                //title of current song
                private String songTitle="";
                //notification id
                private static final int NOTIFY_ID=1;
                //shuffle flag and random
                private boolean shuffle=false;
                private Random rand;
    
                public void onCreate(){
                    //create the service
                    super.onCreate();
                    //initialize position
                    songPosn=0;
                    //random
                    rand=new Random();
                    //create player
                    player = new MediaPlayer();
                    //initialize
                    initMusicPlayer();
                }
    
                public void initMusicPlayer(){
                    //set player properties
                    player.setWakeMode(getApplicationContext(), 
                            PowerManager.PARTIAL_WAKE_LOCK);
                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    //set listeners
                    player.setOnPreparedListener(this);
                    player.setOnCompletionListener(this);
                    player.setOnErrorListener(this);
                }
    
                //pass song list
                public void setList(ArrayList<Song> theSongs){
                    songs=theSongs;
                }
    
                //binder
                public class MusicBinder extends Binder {
                    MusicService getService() { 
                        return MusicService.this;
                    }
                }
    
                //activity will bind to service
                @Override
                public IBinder onBind(Intent intent) {
                    return musicBind;
                }
    
                //release resources when unbind
                @Override
                public boolean onUnbind(Intent intent){
                    player.stop();
                    player.release();
                    return false;
                }
    
                //play a song
                public void playSong(){
                    //play
                    player.reset();
                    //get song
                    Song playSong = songs.get(songPosn);
                    //get title
                    songTitle=playSong.getTitle();
                    //get id
                    long currSong = playSong.getID();
                    //set uri
                    Uri trackUri = ContentUris.withAppendedId(
    
    
    android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                currSong);
                        Uri trackUri2 =     ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.INTERNAL_CONTENT_URI,currSong);
    
    
    //set the data source
                    try{ 
                        player.setDataSource(getApplicationContext(), trackUri);
                        player.setDataSource(getApplicationContext(),trackUri2);
                    }
                    catch(Exception e){
                        Log.e("MUSIC SERVICE", "Error setting data source", e);
                    }
                    player.prepareAsync(); 
                }
    
                //set the song
                public void setSong(int songIndex){
                    songPosn=songIndex; 
                }
    
                @Override
                public void onCompletion(MediaPlayer mp) {
                    //check if playback has reached the end of a track
                    if(player.getCurrentPosition()>0){
                        mp.reset();
                        playNext();
                    }
                }
    
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    Log.v("MUSIC PLAYER", "Playback Error");
                    mp.reset();
                    return false;
                }
    
                @Override
                public void onPrepared(MediaPlayer mp) {
                    //start playback
                    mp.start();
                    //notification
                    Intent notIntent = new Intent(this, MainActivity.class);
                    notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    PendingIntent pendInt = PendingIntent.getActivity(this, 0,
                            notIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
                    Notification.Builder builder = new Notification.Builder(this);
    
                    builder.setContentIntent(pendInt)
                    .setSmallIcon(R.drawable.play)
                    .setTicker(songTitle)
                    .setOngoing(true)
                    .setContentTitle("Playing")
                    .setContentText(songTitle);
                    Notification ya= builder.build();
                    startForeground(NOTIFY_ID, ya);
    
                }
    
                //playback methods
                public int getPosn(){
                    return player.getCurrentPosition();
                }
    
                public int getDur(){
                    return player.getDuration();
                }
    
                public boolean isPng(){
                    return player.isPlaying();
                }
    
                public void pausePlayer(){
                    player.pause();
                }
    
                public void seek(int posn){
                    player.seekTo(posn);
                }
    
                public void go(){
                    player.start();
                }
    
                //skip to previous track
                public void playPrev(){
                    songPosn--;
                    if(songPosn<0) songPosn=songs.size()-1;
                    playSong();
                }
    
                //skip to next
                public void playNext(){
                    if(shuffle){
                        int newSong = songPosn;
                        while(newSong==songPosn){
                            newSong=rand.nextInt(songs.size());
                        }
                        songPosn=newSong;
                    }
                    else{
                        songPosn++;
                        if(songPosn>=songs.size()) songPosn=0;
                    }
                    playSong();
                }
    
                @Override
                public void onDestroy() {
                    stopForeground(true);
                }
    
                //toggle shuffle
                public void setShuffle(){
                    if(shuffle) shuffle=false;
                    else shuffle=true;
                }
    
            }
    

    3.我的清单          

        <uses-sdk
            android:minSdkVersion="9"
            android:targetSdkVersion="19" />
        <uses-permission android:name="android.permission.WAKE_LOCK"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.playmusic.ghufron.MainActivity"
                android:label="@string/app_name" 
                android:launchMode="singleTop"
                android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service android:name="com.playmusic.ghufron.MusicService"/>
    
    
        </application>
    
    </manifest>
    

    这是我的main_activity.xml

    <LinearLayout xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#000000"
        android:baselineAligned="true"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <!-- song list -->
    
        <LinearLayout
            android:id="@+id/ll"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#000000"
            android:gravity="right" >
    
            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/Noads" />
        </LinearLayout>
    
        <ListView
            android:id="@+id/song_list"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="3.29"
            android:longClickable="true" >
    
        </ListView>
    
    </LinearLayout>
    

    这里是我的歌曲适配器

    package com.playmusic.ghufron;
    
    import java.util.ArrayList;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    
    
    public class SongAdapter extends BaseAdapter {
    
        //song list and layout
        private ArrayList<Song> songs;
        private LayoutInflater songInf;
    
        //constructor
        public SongAdapter(Context c, ArrayList<Song> theSongs){
            songs=theSongs;
            songInf=LayoutInflater.from(c);
        }
    
        @Override
        public int getCount() {
            return songs.size();
        }
    
        @Override
        public Object getItem(int arg0) {
            return null;
        }
    
        @Override
        public long getItemId(int arg0) {
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //map to song layout
            LinearLayout songLay = (LinearLayout)songInf.inflate
                    (R.layout.song, parent, false);
            //get title and artist views
            TextView songView = (TextView)songLay.findViewById(R.id.song_title);
            TextView artistView = (TextView)songLay.findViewById(R.id.song_artist);
            //get song using position
            Song currSong = songs.get(position);
            //get title and artist strings
            songView.setText(currSong.getTitle());
            artistView.setText(currSong.getArtist());
            //set position as tag
            songLay.setTag(position);
            return songLay;
        }
    
    }
    

    解释:我的应用程序工作正常但是当我点击列表视图时它崩溃了但是当我点击确定时音乐播放并停止!!!

1 个答案:

答案 0 :(得分:-1)

API级别16(Android 4.1)中添加了build()方法。您可能正在尝试在较旧版本的Android上运行代码。

从API级别16开始,不推荐使用getNotification()方法,但可以在较旧的API级别使用&gt; = 11。

注意:整个Notification.Builder类是在API级别11(Honeycomb)中添加的,因此我假设您的应用程序所需的最低API级别至少为11。

要解决您的问题,您可以使用以下代码。

Notification ya =
    (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) ?
        builder.build() : builder.getNotification();
相关问题