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

Service background상태에서 CameraView를 주기적으로 띄우기가 가능할까요?

0 추천

안녕하세요. 카메라를 완벽하게 못쓰게하는 어플을 만들고있습니다.

여기서 답변달아주신 분들 덕분에 현재 Service를 이용해 Backgroudn상태에서 주기적으로 명령어를 실행시킬 수 있는

죽지않는 어플을 만들었습니다.

 

이제 이 위에 카메라를 못쓰게하는 명령어를 주기적으로 실행시키려고 합니다.

 

카메라를 못쓰게하는 방법으론 디바이스관리자를 통한 CameraDisable()을 쓰지않고(사용자가 해제해버리면 그만이기때문)

제가만든 어플에서 카메라를 실행시킨 후(화면엔 보이지않고, 내부적으로), Camera.release()를 고의적으로 안해서

다른 카메라어플들이 카메라를 못쓰게 하는 방식으로 진행하려고 합니다.

현재 이런 방식으로 카메라를 못쓰게 하는 기능은 구현하였으나 이 기능을 위에서 말한 죽지않는 Background어플에 올려

줘야 하는데.. (백그라운드 상태에서 주기적으로 카메라를 open해서, 다른카메라어플을 못쓰도록 하기 위해)

 

감이 안잡힙니다..ㅠㅠ Service 클래스의 public void run() 메소드 안에서, 간단한 토스트메세지나 음악을 틀어주는정도는

해보았으나, 이 안에서 CameraView를 열어주는건.. 어떻게 해야할까요,,? 아니면 CameraView를 열지않고도 카메라를

쥐어 잡고 있을 방법이 있을까요? 조언부탁드립니다! 감사합니다

 

PersistentService.java

public class PersistentService extends Service implements Runnable {
	private MediaPlayer mp;
    private static final String TAG = "PersistentService";
 
    // 서비스 종료시 재부팅 딜레이 시간, activity의 활성 시간을 벌어야 한다.
    private static final int REBOOT_DELAY_TIMER = 10 * 1000;
 
    // GPS를 받는 주기 시간
    private static final int LOCATION_UPDATE_DELAY = 15 * 1000; // 5 * 60 * 1000
 
    private Handler mHandler;
    private boolean mIsRunning;
    private int mStartId = 0;
 
    @Override
    public IBinder onBind(Intent intent) {
 
        Log.d("PersistentService", "onBind()");
        return null;
    }
 
    @Override
    public void onCreate() {
    	//Notification notification = new Notification(R.drawable.ic_launcher, "서비스 실행됨", System.currentTimeMillis());
    	//notification.setLatestEventInfo(getApplicationContext(), "Screen Service", "Foreground로 실행됨", null);
    	//startForeground(1, notification);
        // 등록된 알람은 제거
        Log.d("PersistentService", "onCreate()");
        unregisterRestartAlarm();
 
        super.onCreate();
 
        mIsRunning = false;
 
    }
 
    @Override
    public void onDestroy() {
 
        // 서비스가 죽었을때 알람 등록
        Log.d("PersistentService", "onDestroy()");
        registerRestartAlarm();
        Toast.makeText(getBaseContext(), "yyyyyyy", Toast.LENGTH_LONG).show(); 
        super.onDestroy();
 
        mIsRunning = false;
    }
 
    /**
     * (non-Javadoc)
     * @see android.app.Service#onStart(android.content.Intent, int)
     * 
     * 서비스가 시작되었을때 run()이 실행되기까지 delay를 handler를 통해서 주고 있다.
     */
    @Override
    public void onStart(Intent intent, int startId) {
 
        Log.d("PersistentService", "onStart()");
        Toast.makeText(getBaseContext(), "start", Toast.LENGTH_LONG).show();
        super.onStart(intent, startId);

        mStartId = startId;
 
        // 5분후에 시작
        mHandler = new Handler();
        mHandler.postDelayed(this, LOCATION_UPDATE_DELAY);
        mIsRunning = true;
 
    }
 
    /**
     * (non-Javadoc)
     * @see java.lang.Runnable#run()
     * 
     * 서비스가 돌아가고 있을때 실제로 내가 원하는 기능을 구현하는 부분
     */
    @Override
    public void run() {
 
        Log.e(TAG, "run()");
     //   mp = MediaPlayer.create(this, R.raw.fooling2);
        Toast.makeText(getBaseContext(), "zzzzzzz", Toast.LENGTH_LONG).show(); 
    //    setContentView(R.layout.activity_main);
      //  mp.start(); 
        if(!mIsRunning)
        {
            Log.d("PersistentService", "run(), mIsRunning is false");
            Log.d("PersistentService", "run(), alarm service end");
            return;
            
        } else {
            
            Log.d("PersistentService", "run(), mIsRunning is true");
            Log.d("PersistentService", "run(), alarm repeat after five minutes");
            
            function();
            
            mHandler.postDelayed(this, LOCATION_UPDATE_DELAY);
            mIsRunning = true;
        }
 
    }
 
    private void function() {
        
        Log.d(TAG, "========================");
        Log.d(TAG, "function()");
        Log.d(TAG, "========================");
        
    }
 
    /**
     * 서비스가 시스템에 의해서 또는 강제적으로 종료되었을 때 호출되어
     * 알람을 등록해서 10초 후에 서비스가 실행되도록 한다.
     */
    private void registerRestartAlarm() {
 
        Log.d("PersistentService", "registerRestartAlarm()");
 
        Intent intent = new Intent(PersistentService.this, RestartService.class);
        intent.setAction(RestartService.ACTION_RESTART_PERSISTENTSERVICE);
        PendingIntent sender = PendingIntent.getBroadcast(PersistentService.this, 0, intent, 0);
 
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += REBOOT_DELAY_TIMER; // 10초 후에 알람이벤트 발생
 
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,REBOOT_DELAY_TIMER, sender);
    }
 
 
    /**
     * 기존 등록되어있는 알람을 해제한다.
     */
    private void unregisterRestartAlarm() {
 
        Log.d("PersistentService", "unregisterRestartAlarm()");
        Intent intent = new Intent(PersistentService.this, RestartService.class);
        intent.setAction(RestartService.ACTION_RESTART_PERSISTENTSERVICE);
        PendingIntent sender = PendingIntent.getBroadcast(PersistentService.this, 0, intent, 0);
 
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.cancel(sender);
    }
}

 

CameraView.java

package com.example.immortal;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback { 
	
	private SurfaceHolder surfaceHolder; 
	private Camera camera; 
	public CameraView(Context context, AttributeSet attrs) { 
		super(context, attrs); 
		surfaceHolder = getHolder(); 
		surfaceHolder.addCallback(this); 
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
		}
	public void surfaceCreated(SurfaceHolder holder) { // 1.
		try { 
			camera = Camera.open(); 
			Log.v("aaa","aaa");
			camera.setPreviewDisplay(surfaceHolder); 
			//2.2이상부터 사용가능 
			camera.lock();
			} catch (Exception e) {
				e.printStackTrace();
				} 
		} 
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 2. 
		camera.startPreview();
		} 
	public void surfaceDestroyed(SurfaceHolder holder) { // 3.
		camera.stopPreview();
	//	camera.release(); 
		if(MainActivity.aa==true)camera.release(); 
		} 
	}

 

배재똥똥 (1,200 포인트) 님이 2015년 4월 15일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...