Использование виджета с кнопками для настройки громкости устройства на Android, простой вопрос …?

#java #android #widget #android-intent #volume

#java #Android #виджет #android-намерение #громкость

Вопрос:

Я просто пытаюсь создать виджет с кнопкой , кнопкой — и индикатором выполнения. Панель должна показывать текущую громкость, а кнопки «плюс» и «минус» должны регулировать громкость телефона. Прямо сейчас я просто пытаюсь заставить кнопку «Плюс» выполнять свою функцию (индикатор выполнения уже показывает нужную громкость при запуске виджета), но всякий раз, когда я нажимаю кнопку, я получаю принудительное закрытие. Я делал приложения раньше, но никогда виджеты, и я не работал с намерениями много. Вот код единственного класса, который есть у моего виджета:

 package com.habosa.volumeslider;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.util.Log;
import android.widget.RemoteViews;

public class VolumeWidgetProvider extends AppWidgetProvider {
    private AudioManager volume;
    private int whichStream = AudioManager.STREAM_RING;


public void goRinger() {
    whichStream = AudioManager.STREAM_RING;
}

public void goMedia() {
    whichStream = AudioManager.STREAM_MUSIC;
}
public void goAlarm() {
    whichStream = AudioManager.STREAM_ALARM;
}
public void goNotification() {
    whichStream = AudioManager.STREAM_NOTIFICATION;
}

public void volumeUp() {
    volume.adjustStreamVolume(whichStream, AudioManager.ADJUST_RAISE, 0);
}

public void volumeDown() {
    volume.adjustStreamVolume(whichStream, AudioManager.ADJUST_LOWER, 0);
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    volume = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int maxVol = volume.getStreamMaxVolume(whichStream);
    int currentVol = volume.getStreamVolume(whichStream);
    RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.main);
    remoteView.setProgressBar(R.id.ProgressBar01, maxVol, currentVol, false);

    Intent plus = new Intent(context, VolumeWidgetProvider.class);
    plus.putExtra("msg", "plus");
    plus.setAction("BUTTONPRESS");

    PendingIntent plusPendingIntent = PendingIntent.getBroadcast(context, 0, plus, 0);

    remoteView.setOnClickPendingIntent(R.id.PlusButton, plusPendingIntent);

    for (int appWidgetId : appWidgetIds) {
      appWidgetManager.updateAppWidget(appWidgetId, remoteView);
    }
}

@Override
public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("BUTTONPRESS")) {
            String msg = "null";
            try {
                msg = intent.getStringExtra("msg");
            } catch (NullPointerException e) {
                Log.e("Error", "msg = null");
            }

            if (msg.equals("plus")) {volumeUp();}

            PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
        } else {
            // do nothing
        }

        super.onReceive(context, intent);
    }
}
  

и вот мой манифест, если это уместно:

 <?xml version="1.0" encoding="utf-8"?>
  

 <receiver android:name="VolumeWidgetProvider" >
<intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    <action android:name="com.habosa.volumeslider.VolumeWidgetProvider.BUTTONPRESS"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/volumewidgetproviderinfo" />
</receiver>

</application>
<uses-sdk android:minSdkVersion="7" />
  

Что я делаю не так?

Ответ №1:

Взгляните на https://github.com/commonsguy/cw-andtutorials/tree/master/34-AdvAppWidget в качестве достойного примера для подражания.

Обратите внимание, что решением, вероятно, не будет вызывать класс app widget provider из намерения, как вы, по-видимому, пытаетесь сделать в настоящее время.

Комментарии:

1. Я просто хочу, чтобы кнопки, которые я создал, вызывали методы в моем классе, должен быть простой способ сделать это, не проходя через столько обручей, верно?

2. Нет. Не с виджетами приложений. Требуются обручи. И это еще не все! blog.elsdoerfer.name/2009/06/03 /…