Как показать уведомление с кнопкой воспроизведения / остановки? - PullRequest
0 голосов
/ 29 августа 2018

Мне нужна помощь, так как я немного новичок в Android. В моем приложении для Android, над которым я работаю, я реализовал класс обслуживания MediaPlayer (PlayService.java), который будет воспроизводить потоковый аудиосигнал в реальном времени с удаленного источника. Мой рабочий код для класса обслуживания MediaPlayer:

public class PlayService extends Service implements MediaPlayer.OnCompletionListener,MediaPlayer.OnPreparedListener,
        MediaPlayer.OnErrorListener,MediaPlayer.OnSeekCompleteListener,MediaPlayer.OnInfoListener,
        MediaPlayer.OnBufferingUpdateListener,AudioManager.OnAudioFocusChangeListener  {

    private AudioManager audioManager;
    private MediaPlayer mediaPlayer = new MediaPlayer();
    private String sentAudioLink;

    @Override
    public void onCreate() {
        mediaPlayer.setOnCompletionListener(this);
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnErrorListener(this);
        mediaPlayer.setOnSeekCompleteListener(this);
        mediaPlayer.setOnInfoListener(this);
        mediaPlayer.setOnBufferingUpdateListener(this);
        mediaPlayer.reset();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        sentAudioLink = intent.getExtras().getString("sentAudioLink");
        mediaPlayer.reset();
        //setup the media player data source using the strAudioLink value
        if (!mediaPlayer.isPlaying()) {
            try {
                mediaPlayer.setDataSource(sentAudioLink);
                //prepare media player
                mediaPlayer.prepareAsync();
            } catch (IllegalStateException e) {
                Log.e("workingerror1", e.toString());
                stopSelf();
            } catch (IllegalArgumentException e) {
                Log.e("workingerror2", e.toString());
                stopSelf();
            } catch (IOException e) {
                Log.e("workingerror3", e.toString());
                stopSelf();
            }

            //buildNotification(PlaybackStatus.PLAYING);
        }

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {

    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        stopMedia();
        stopSelf();
    }

    public void stopMedia() {
        if (mediaPlayer.isPlaying())
            mediaPlayer.stop();
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        //Invoked when there has been an error during an asynchronous operation
        return false;
    }

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        return false;
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        playMedia();
    }

    public void playMedia() {
        if (!mediaPlayer.isPlaying()) {
            mediaPlayer.start();
        }
    }

    @Override
    public void onSeekComplete(MediaPlayer mp) {

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
} 

Единственная проблема, с которой я сталкиваюсь, это то, что я просто хочу, чтобы музыкальный проигрыватель генерировал пользовательское уведомление при воспроизведении аудиопотока. И для этой цели я создал класс custom_notification.xml. Я не знаю, как мне создать это пользовательское уведомление от службы и прослушивать вызовы для кнопки воспроизведения и остановки действия.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp">
    <ImageView
        android:layout_alignParentLeft="true"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:src="@drawable/uow_logo"
        android:id="@+id/imgAppIc" />
    <RelativeLayout
        android:layout_toRightOf="@id/imgAppIc"
        android:singleLine="true"
        android:id="@+id/textView1"
        android:ellipsize="marquee"
        android:layout_marginLeft="7dp"
        android:layout_marginTop="5dp"
        android:marqueeRepeatLimit ="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:scrollHorizontally="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/selected_track_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Title Text"
            android:textColor="#f7212121"
            android:textSize="15dp"/>
        <TextView
            android:id="@+id/selected_track_title2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="FM Radio 100"
            android:textColor="#767676"
            android:layout_below="@+id/selected_track_title"
            android:layout_marginTop="1dp"
            android:textSize="15dp" />
    </RelativeLayout>
    <ImageButton
        android:id="@+id/play_pause"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:gravity="right"
        android:layout_alignParentRight="true"
        android:layout_marginTop="3dp" />
</RelativeLayout>

1 Ответ

0 голосов
/ 29 августа 2018

Этот ответ может помочь вам ...

Ссылка: Как создать пользовательский макет уведомления в Android?

Чтобы определить пользовательский макет уведомления, начните с создания экземпляра объекта RemoteViews, который надувает файл макета XML. Тогда вместо вызов методов, таких как setContentTitle (), вызов setContent (). Установить детали содержимого в пользовательском уведомлении, используйте методы в RemoteViews для установки значений дочерних элементов представления:

Создать макет XML для уведомления в отдельном файле. Вы можете используйте любое имя файла, но вы должны использовать расширение .xml ваше приложение, используйте методы RemoteViews для определения значков уведомлений и текст. Поместите этот объект RemoteViews в ваш NotificationCompat.Builder путем вызова setContent (). Избегайте установки фон Drawable на вашем объекте RemoteViews, потому что ваш текст цвет может стать нечитаемым.

custom_push.xml имеет мои собственные представления R.id.image, R.id.text, R.id.title

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="fill_parent"
    android:layout_height="64dp"
    android:padding="10dp" >
    <ImageView
        android:src="@mipmap/ic_launcher"
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="10dp" />
    <TextView
        android:textSize="13dp"
        android:textColor="#000"
        android:text="Testing"
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image"
        />
    <TextView
        android:textSize="13dp"
        android:textColor="#000"
        android:text="Testing is awecome"
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image"
        android:layout_below="@id/title"
         />
</RelativeLayout>

Создание экземпляра объекта RemoteViews и его установка,

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_push);
contentView.setImageViewResource(R.id.image, R.mipmap.ic_launcher);
contentView.setTextViewText(R.id.title, "Custom notification");
contentView.setTextViewText(R.id.text, "This is a custom layout");

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.icon)
.setContent(contentView);

Notification notification = mBuilder.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notificationManager.notify(1, notification);

Notification Views Like

проверка: https://developer.android.com/guide/topics/ui/notifiers/notifications.html#ApplyStyle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...