Доступ к представлению из службы - PullRequest
0 голосов
/ 02 июня 2018

Итак, в основном, я получил представление списка, в котором показан список групп.Когда я нажимаю на одну из полос в списке, она создает страницу профиля полосы через адаптер.В этом макете у меня есть кнопка воспроизведения, которая запускает службу MediaPlayer и воспроизводит песню.

Пока все хорошо.

Проблема в том, что я пытаюсь обновить файл seekBar, расположенныйна странице профиля группы (созданной адаптером, упомянутым выше), из файла Java службы MediaPlayer, но я не могу его найти.

Я пытаюсь использовать:

    LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.activity_singleband, null, false);
    seekBar = (SeekBar) layout.findViewById(R.id.seekBarBand);

но похоже, что он использует другой «экземпляр» представления, а не тот, который я сейчас просматриваю.

Вот полный Java-файл MusicService:

public class MusicService extends Service {
SeekBar seekBar;
Handler handler;
Runnable runnable;

NotificationManager nMN;

TextView BandName;

String songLink;
String songName;
String bandName;

String SongPlaying="";
String BandPlaying="";

public static MediaPlayer mp;
public static Boolean mpState = true;
public static Boolean mpPause = false;
public static Boolean isPlaying = false;


@Override
public void onCreate() {
            super.onCreate();

}
// Play Cycle for seekBar
public void PlayCycle(){
    seekBar.setProgress(mp.getCurrentPosition());
    if (mp.isPlaying()){
        runnable = new Runnable() {
            @Override
            public void run() {
                PlayCycle();

            }
        };
        handler.postDelayed(runnable, 1000);
    }

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    songLink = intent.getStringExtra("SongLink");
    songName = intent.getStringExtra("SongName");
    bandName = intent.getStringExtra("BandName");


    LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.activity_singleband, null, false);
    seekBar = (SeekBar) layout.findViewById(R.id.seekBarBand);
    BandName = (TextView) layout.findViewById(R.id.singleBandNameView);
    BandName.setText("Bla Bla");
    System.out.print("Band Name : "+ BandName.getText() );

    handler = new Handler();

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
            if (input){
                mp.seekTo(progress); 
            }
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    });

    if (isPlaying && !songName.equals(SongPlaying) && !BandPlaying.equals(bandName)) {
        Stop();
        mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            Uri songUri = Uri.parse(songLink);
            mp.setDataSource(getApplicationContext(), songUri);
            SongPlaying = songName;
            Toast.makeText(getApplicationContext(), "Please wait", Toast.LENGTH_SHORT).show();
            isPlaying=true;
            new prepare().execute();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    else if (!isPlaying && !songName.equals(SongPlaying) && !BandPlaying.equals(bandName) ) {
        mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            Uri songUri = Uri.parse(songLink);
            mp.setDataSource(getApplicationContext(), songUri);
            SongPlaying = songName;
            Toast.makeText(getApplicationContext(), "Please wait", Toast.LENGTH_SHORT).show();
            new prepare().execute();
            isPlaying=true;
        }
        catch (IOException e) {
            e.printStackTrace();
        }

    }
    else {
        Toast.makeText(getApplicationContext(), "Song is Already Playing", Toast.LENGTH_SHORT).show();

    }
    return super.onStartCommand(intent, flags, startId);
    }

@Override
public void onDestroy() {
    super.onDestroy();
    mp.release();
    handler.removeCallbacks(runnable);
}




/// Permanent Notification
private void showNotification() {
    nMN = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification n = new Notification.Builder(this)
            .setContentTitle(songName)
            .setContentText(bandName)
            .setSmallIcon(R.drawable.ic_bandcamp)
            //.addAction(R.drawable.ic_play_arrow_black_24dp, "button1", new pause())
            .setOngoing(true)
            .build();
    nMN.notify(1, n);
}

/// PREPARE SONG TO PLAY //
public class prepare extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.prepare();
            PlayCycle();
            seekBar.setMax(mp.getDuration());
            mp.start();
            SongPlaying = songName;
            isPlaying=true;
            showNotification();  // show notification
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Toast.makeText(getApplicationContext(),"Song Finished", Toast.LENGTH_LONG).show();
                    new stop().execute();
                }
            });
        } catch (IOException io){ io.printStackTrace(); }
        return null; }}


/// STOP PLAYING SONG //
public static void Stop()
{
    mp.reset();
    mp.release();
    isPlaying=false;
}
public static class stop extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.reset();
            mp.release();
            isPlaying=false;
        } catch (Exception io){ io.printStackTrace(); }
        return null; }}

/// PAUSE PLAYING SONG//
public static class pause extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.pause(); }
        catch (Exception io){ io.printStackTrace();   }
        return null; }}

public static class start extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.start(); }
        catch (Exception io){ io.printStackTrace();   }
        return null; }}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

}

Очень хотелось бы получить несколько предложений.Заранее спасибо.

1 Ответ

0 голосов
/ 03 июня 2018

Окей, во-первых, я предлагаю вам прочитать больше о классах Android Service.Во-вторых, НЕ размещайте визуальные компоненты, такие как SeekBar или TextView, в Сервисе, потому что это не имеет никакого смысла.Сервис является просто фоновой задачей и не знает о пользовательском интерфейсе.Поскольку он выполняется в фоновом режиме, вам даже не нужен AsyncTask, поэтому в-третьих удалите ALL AsyncTasks в вашем сервисе и запустите их задачу так, как будто они не должны выполняться в фоновом режиме.

Итак, все, что вам нужно сделать, это создать фрагмент / действие для пользовательского интерфейса, а затем связать свой фрагмент / активность с вашей службой для взаимодействия и обновления компонентов пользовательского интерфейса.Самый простой способ - сделать Сервис синглтоном, как здесь:

    public class MusicService extends Service {
private static MusicService instance = null;

public static MusicService getInstance() {
    return instance;
}

Handler handler;
Runnable runnable;

NotificationManager nMN;

String songLink;
String songName;
String bandName;

String SongPlaying="";
String BandPlaying="";

public static MediaPlayer mp;
public static Boolean mpState = true;
public static Boolean mpPause = false;
public static Boolean isPlaying = false;


@Override
public void onCreate() {
    instance = this;
    super.onCreate();
}
// Play Cycle for seekBar
public void PlayCycle(){
    seekBar.setProgress(mp.getCurrentPosition());
    if (mp.isPlaying()){
        runnable = new Runnable() {
            @Override
            public void run() {
                PlayCycle();

            }
        };
        handler.postDelayed(runnable, 1000);
    }

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    songLink = intent.getStringExtra("SongLink");
    songName = intent.getStringExtra("SongName");
    bandName = intent.getStringExtra("BandName");
    handler = new Handler();

    if (isPlaying && !songName.equals(SongPlaying) && !BandPlaying.equals(bandName)) {
        Stop();
        mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            Uri songUri = Uri.parse(songLink);
            mp.setDataSource(getApplicationContext(), songUri);
            SongPlaying = songName;
            Toast.makeText(getApplicationContext(), "Please wait", Toast.LENGTH_SHORT).show();
            isPlaying=true;
            new prepare().execute();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    else if (!isPlaying && !songName.equals(SongPlaying) && !BandPlaying.equals(bandName) ) {
        mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            Uri songUri = Uri.parse(songLink);
            mp.setDataSource(getApplicationContext(), songUri);
            SongPlaying = songName;
            Toast.makeText(getApplicationContext(), "Please wait", Toast.LENGTH_SHORT).show();
            new prepare().execute();
            isPlaying=true;
        }
        catch (IOException e) {
            e.printStackTrace();
        }

    }
    else {
        Toast.makeText(getApplicationContext(), "Song is Already Playing", Toast.LENGTH_SHORT).show();

    }
    return super.onStartCommand(intent, flags, startId);
    }

@Override
public void onDestroy() {
    super.onDestroy();
    mp.release();
    handler.removeCallbacks(runnable);
}




/// Permanent Notification
private void showNotification() {
    nMN = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification n = new Notification.Builder(this)
            .setContentTitle(songName)
            .setContentText(bandName)
            .setSmallIcon(R.drawable.ic_bandcamp)
            //.addAction(R.drawable.ic_play_arrow_black_24dp, "button1", new pause())
            .setOngoing(true)
            .build();
    nMN.notify(1, n);
}

/// PREPARE SONG TO PLAY //
public class prepare extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.prepare();
            PlayCycle();
            seekBar.setMax(mp.getDuration());
            mp.start();
            SongPlaying = songName;
            isPlaying=true;
            showNotification();  // show notification
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Toast.makeText(getApplicationContext(),"Song Finished", Toast.LENGTH_LONG).show();
                    new stop().execute();
                }
            });
        } catch (IOException io){ io.printStackTrace(); }
        return null; }}


/// STOP PLAYING SONG //
public static void Stop()
{
    mp.reset();
    mp.release();
    isPlaying=false;
}
public static class stop extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.reset();
            mp.release();
            isPlaying=false;
        } catch (Exception io){ io.printStackTrace(); }
        return null; }}

/// PAUSE PLAYING SONG//
public static class pause extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.pause(); }
        catch (Exception io){ io.printStackTrace();   }
        return null; }}

public static class start extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            mp.start(); }
        catch (Exception io){ io.printStackTrace();   }
        return null; }}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    // throw new UnsupportedOperationException("Not yet implemented");
    return null;
}
...