質問

この私の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.ここで私の音楽サービス

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

}

説明する:私のアプリは正常に動作していますが、リストビューをクリックするとクラッシュしましたが、音楽は再生され、okをクリックすると停止します!!!

役に立ちましたか?

解決

ザ- ビルド() メソッドはAPIレベル16(Android4.1)で追加されました。古いバージョンのAndroidでコードを実行しようとしている可能性があります。

ザ- getNotification() メソッドはapiレベル16から非推奨になりましたが、古いAPIレベル>=11で使用するのは問題ありません。

メモ:全体 通知。ビルダー クラスはAPIレベル11(Honeycomb)で追加されたため、アプリの最小必要なAPIレベルは少なくとも11であると想定しています。

問題を解決するには、次のコードを使用できます。

Notification ya =
    (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) ?
        builder.build() : builder.getNotification();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top