-6

This my 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. Here my main activity 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.here my music service

        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.here my manifest

    <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>

this my 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>

here my song adapter

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;
    }

}

explain: my app is working correctly but when i click list view it crashed but the music played and stop when i click ok!!!

1 Answers1

-1

The build() method was added in API level 16 (Android 4.1). You are probably trying to run your code on an older version of Android.

The getNotification() method is deprecated starting at API level 16, but is fine to use in older API levels >= 11.

Note: The entire Notification.Builder class was added in API level 11 (Honeycomb), so I assume that your app's minimum required API level is at least 11.

To fix your issue, you can use the following code.

Notification ya =
    (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) ?
        builder.build() : builder.getNotification();
cybersam
  • 63,203
  • 6
  • 53
  • 76