마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Class 에서 다른 Class 호출시 오류

0 추천

안녕하세요? ^^

실질적으로 Android 개발 3일째에 왔습니다.

센서의 Z/Y 값을 체크해 디스플레이의 화면 밝기를 조절하는걸 만들고자 하는데요 ^^;

Switch 값이 true 일 때 센서 값을 불러오는 형태 입니다. 그런데 true 일 때 오류가 발생합니다.

오류 원문은 다음과 같습니다. onCreate 이전에 콜을 해서 그렇다는데 ..

이미 onCreate 후 Switch 를 체크하고 있는게 아닌건가요? ^^;

 java.lang.IllegalStateException: System services not available to Activities before onCreate()
            at android.app.Activity.getSystemService(Activity.java:4463)
            at com.knspower.watchautoon.SensorWork.sensorCheck(SensorWork.java:25)
            at com.knspower.watchautoon.WatchAutoOn$1.onCheckedChanged(WatchAutoOn.java:28)
            at android.widget.CompoundButton.setChecked(CompoundButton.java:126)
            at android.widget.Switch.setChecked(Switch.java:666)
            at android.widget.CompoundButton.toggle(CompoundButton.java:87)
            at android.widget.CompoundButton.performClick(CompoundButton.java:99)
            at android.view.View$PerformClick.run(View.java:17355)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

코드는 다음과 같습니다! 감사합니다 //ㅂ//

package com.knspower.watchautoon;

import android.os.Bundle;

import android.app.Activity;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Switch;


public class WatchAutoOn extends Activity {

    private Switch activationSwitch;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_watch_auto_on);

        final SensorWork __SW = new SensorWork();

        activationSwitch = (Switch) findViewById(R.id.activationSwitch);
        activationSwitch.setChecked(false);
        activationSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked) {
                    __SW.sensorCheck();
                    __SW.initializeViews();
                } else {
                }
            }
        });
    }
//    winManager = (WindowManager) getSystemService(WINDOW_SERVICE);
//    winManager.getDefaultDisplay();


}
package com.knspower.watchautoon;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.view.WindowManager;
import android.widget.TextView;

public class SensorWork extends WatchAutoOn implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor accelerometer;
    private float sensorX = 0;
    private float sensorY = 0;
    private float sensorZ = 0;
    //private WindowManager winManager;

    private TextView currentX, currentY, currentZ;

    public void sensorCheck(){
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
            accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);

        } else {
            // No Sensor!
        }
    }

    public void initializeViews() {
        currentX = (TextView) findViewById(R.id.currentX);
        currentY = (TextView) findViewById(R.id.currentY);
        currentZ = (TextView) findViewById(R.id.currentZ);
    }
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    public void requestScreenOn(int Brightness) {
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
        params.screenBrightness = Brightness;
        getWindow().setAttributes(params);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        displayCleanValues();
        displayCurrentValues();

        sensorX = event.values[0];
        sensorY = event.values[1];
        sensorZ = event.values[2];

        if(sensorY > 0 && sensorY < 4 & sensorZ > 8) {
            requestScreenOn(100);
        } else {
            requestScreenOn(0);
        }
    }
    public void displayCleanValues() {
        currentX.setText("0.0");
        currentY.setText("0.0");
        currentZ.setText("0.0");
    }

    public void displayCurrentValues() {
        currentX.setText(Float.toString(sensorX));
        currentY.setText(Float.toString(sensorY));
        currentZ.setText(Float.toString(sensorZ));
    }
}

 

릴루릴리 (140 포인트) 님이 2015년 7월 3일 질문

1개의 답변

0 추천

저도 정확하게 알지는 못해서 가정하는 것인데요.

일단 의심스러운 부분은 WatchAutoOn, SensorWork, Activity 요 관계가

SensorWork는 WatchAutoOn을 상속받으시고 WatchAutoOn은 Activity를 상속받으시는 듯한데요. SensorWork은 언제 만들어지나요? SensorWork이 생성될때 OnCreate가 일어날것 같고 OnCreate는 부모가 가지는 WatchAutoOn의 OnCreate하나 밖에는 현제 않보이는듯한데요.. 아무튼 그것이  SensorWork의 OnCreate인듯 보이는데요 그렇다면 SensorWork의 onCreate가 정상적으로 이루어지고서 ..

 

어 그런데 이상한것도 보이내요. 부모가 자식을 참조하고 있내요.

SensorWork extends WatchAutoOn

final SensorWork __SW = new SensorWork();

SensorWork은 WatchAutoOn의 자식이고, WatchAutoOn은 SensorWork을 내부에서 만들어서 사용하내요.

이렇게되면 꼬이지 않나요?

컴러기 (22,230 포인트) 님이 2015년 7월 3일 답변
...