안녕하십니까 초보개발자입니다.
다름이 아니라 나침반 위젯을 개발하는데 중간에 값이 계속 멈춰서 문의드립니다.
제가 개발 지식이 딸리는지라 위젯에서 나침반 방향침을 돌리는 방법은 모르겠고해서
실시간 업데이트 시간을 0.5초 정도로 하여 그 때마다 값을 받아와 그에 맞는 이미지로 갱신하는 방법으로
나침반을 제작했는데요. (물론 아직 마그네틱 센서 및 가속도 센서를 적용하지는 않았습니다.)
방향센서를 통해서 값을 받아서 찍는데 처음엔 이미지가 잘 갱신되다가 후에 가면
값이 멈추더군요..
이렇게 멈추는 현상을 없앨 수 있는 방법이 없을까요? 문의드립니다.
고수님들의 답변 기다리겠습니다. 감사합니다.
(code)
public class MainCompassAppWidgetProvider extends AppWidgetProvider {
private static final int WIDGET_UPDATE_INTERVAL = 500;
private static PendingIntent mSender;
private static AlarmManager mManager;
//static : 전 class에서 값 공유함
static SensorManager mSensorManager = null;
static Sensor oriSensor = null;
static SensorEventListener oriL = null;
static int data=0;
// int sec = 0;
// Date d = new Date(System.currentTimeMillis());
// Context context;
public void onReceive(Context context, Intent intent)
{
super.onReceive(context, intent);
String action = intent.getAction();
// 위젯 업데이트 인텐트를 수신했을 때
if(action.equals("android.appwidget.action.APPWIDGET_UPDATE"))
{
removePreviousAlarm();
long firstTime = System.currentTimeMillis() + WIDGET_UPDATE_INTERVAL;
mSender = PendingIntent.getBroadcast(context, 0, intent, 0);
mManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mManager.set(AlarmManager.RTC, firstTime, mSender);
}
// 위젯 제거 인텐트를 수신했을 때
else if(action.equals("android.appwidget.action.APPWIDGET_DISABLED"))
{
removePreviousAlarm();
}
}
public static final int[] mCompassImage = {
R.drawable.img_compass_arr_0,R.drawable.img_compass_arr_1,R.drawable.img_compass_arr_2,R.drawable.img_compass_arr_3,R.drawable.img_compass_arr_4,R.drawable.img_compass_arr_5,
R.drawable.img_compass_arr_6,................ }; //360개 이미지 제작
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
// 현재 클래스로 등록된 모든 위젯의 리스트를 가져옴
appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, getClass()));
super.onUpdate(context, appWidgetManager, appWidgetIds);
final int N = appWidgetIds.length;
for(int i = 0 ; i < N ; i++)
{
int appWidgetId = appWidgetIds[i];
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
//위젯의 형태를 업데이트합니다.
//@param context 컨텍스트
//@param appWidgetManager 위젯 메니저
//@param appWidgetId 업데이트할 위젯 아이디
void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
{
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); //SensorManager 인스턴스를 가져옴
oriSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); // 방향센서
mSensorManager.registerListener(oriL, oriSensor, SensorManager.SENSOR_DELAY_GAME); //방향센서 Listener object 등록
oriL = new eventListener(); //방향센서 Listener instance
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main_compass_activity);
int sec = 0;
sec = data;
Log.e("---Debug---",Integer.toString(data));
updateViews.setImageViewResource(R.id.compass_background, R.drawable.img_compass_bg);
updateViews.setImageViewResource(R.id.compass_bar, mCompassImage[sec]);
appWidgetManager.updateAppWidget(appWidgetId, updateViews);
}
class eventListener implements SensorEventListener{
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
data = (int)event.values[0];
}
}
//예약되어있는 알람을 취소합니다.
public void removePreviousAlarm()
{
if(mManager != null && mSender != null)
{
mSender.cancel();
mManager.cancel(mSender);
}
}
}