2011-04-25 2 views
0

나는 단순히 + 버튼, - 버튼 및 진행 바를 사용하여 위젯을 만들려고합니다. 막대에는 현재 볼륨이 표시되고 플러스 및 마이너스 버튼은 전화 볼륨을 제어해야합니다. 지금은 그냥 더하기 버튼의 기능을 수행하려고합니다. (진행 막대는 위젯이 시작될 때 이미 올바른 볼륨을 보여줍니다.) 버튼을 클릭 할 때마다 강제 종료됩니다. 전에 앱을 만들었지 만 위젯을 사용하지는 않았으며 의도를 많이 사용하지 않았습니다.Android에서 기기 볼륨을 설정하는 버튼이있는 위젯을 사용하면 쉽게 질문 할 수 있습니다 ...?

<?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" /> 

무엇 오전 : 그와 관련된 경우 여기를

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

을 내 매니페스트됩니다 : 여기 내 위젯이있는 유일한 클래스에 코드입니다 내가 잘못하고있어?

답변

1

예의 바른 예를 보려면 https://github.com/commonsguy/cw-andtutorials/tree/master/34-AdvAppWidget을보십시오.

분명히 현재 시도하고있는 것처럼 솔루션은 Intent에서 앱 위젯 공급자 클래스를 호출하지 않을 것입니다.

+0

나는 수업에서 메소드를 호출하기 위해 만든 버튼을 원한다. 이렇게 많은 농구를 통과하지 않고도 쉽게 할 수있는 방법이 있어야한다. 맞습니까? –

+1

Nope. 앱 위젯이 아닙니다. 농구가 필요합니다. 그리고 더 많은 것이 있습니다! http://blog.elsdoerfer.name/2009/06/03/writing-an-android-widget-what-the-docs-dont-tell-you/ –