package com.example.alwaysontop;
import android.annotation.SuppressLint;
import android.app.KeyguardManager;
import android.app.Service;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.Toast;
@SuppressLint("ClickableViewAccessibility")
public class BackService extends Service {
private ImageView imgView1;
private Button btn1;
private WindowManager.LayoutParams mParams; //layout params 객체. 뷰의 위치 및 크기를 지정하는 객체
private WindowManager mWindowManager; //윈도우 매니저
private float START_X, START_Y; //움직이기 위해 터치한 시작 점
private int PREV_X, PREV_Y; //움직이기 이전에 뷰가 위치한 점
private int MAX_X = -1, MAX_Y = -1; //뷰의 위치 최대 값
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@SuppressLint("NewApi")
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Point mPoint = new Point();
mWindowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
Display mDisplay = mWindowManager.getDefaultDisplay();
mDisplay.getSize(mPoint);
imgView1 = new ImageView(this);
imgView1.setImageResource(R.drawable.clock);
imgView1.setScaleType(ScaleType.FIT_XY);
imgView1.setOnTouchListener(mViewTouchListener); //터치 이벤트
mParams = new WindowManager.LayoutParams(
mPoint.x / 3,
mPoint.y / 4,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
mParams.gravity = Gravity.LEFT | Gravity.TOP;
mParams.verticalMargin = 0.1f;
mParams.horizontalMargin = 0.1f;
//myParam.gravity = Gravity.CENTER;
mWindowManager.addView(imgView1, mParams);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
public void toastshow(){
Toast.makeText(this, "데이터가 연결되었습니다.", Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(imgView1 != null){
((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(imgView1);
imgView1 = null;
}
if(btn1 != null){
((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(btn1);
btn1 = null;
}
}
private OnTouchListener mViewTouchListener = new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
Log.e("뷰 터치이벤트!", "ㅇ");
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN: //사용자 터치 다운이면
if(MAX_X == -1)
setMaxPosition();
START_X = event.getRawX(); //터치 시작 점
START_Y = event.getRawY(); //터치 시작 점
PREV_X = mParams.x; //뷰의 시작 점
PREV_Y = mParams.y; //뷰의 시작 점
break;
case MotionEvent.ACTION_MOVE:
int x = (int)(event.getRawX() - START_X); //이동한 거리
int y = (int)(event.getRawY() - START_Y); //이동한 거리
//터치해서 이동한 만큼 이동 시킨다
mParams.x = PREV_X + x;
mParams.y = PREV_Y + y;
optimizePosition(); //뷰의 위치 최적화
mWindowManager.updateViewLayout(imgView1, mParams); //뷰 업데이트
break;
}
return true;
}
};
private void setMaxPosition() {
DisplayMetrics matrix = new DisplayMetrics();
mWindowManager.getDefaultDisplay().getMetrics(matrix); //화면 정보를 가져와서
MAX_X = matrix.widthPixels - imgView1.getWidth(); //x 최대값 설정
MAX_Y = matrix.heightPixels - imgView1.getHeight(); //y 최대값 설정
}
private void optimizePosition() {
//최대값 넘어가지 않게 설정
if(mParams.x > MAX_X) mParams.x = MAX_X;
if(mParams.y > MAX_Y) mParams.y = MAX_Y;
if(mParams.x < 0) mParams.x = 0;
if(mParams.y < 0) mParams.y = 0;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
setMaxPosition(); //최대값 다시 설정
optimizePosition(); //뷰 위치 최적화
}
}
안녕하세요. 안드로이드로 앱을 개발중인 초보 개발자입니다.
최상위 뷰를 통해서 잠금화면에서 특정 이미지를 선택시 앱이 자동으로
실행되도록 하는 기능을 만들고 싶은데요
검색을 통해서 이미지를 잠금화면 위에 올려놓는 것까지는 성공했는데,
이벤트가 먹히지 않아서 애를 먹고있습니다.
WindowManager.LayoutParams의 TYPE을 설정하는 부분에
TYPE_SYSTEM_OVERLAY 으로 설정하니 잠금화면에 이미지뷰는 나오는데
이벤트가 먹히지 않고 다른 소스를 검색해보니 TYPE_PHONE으로 설정하면
터치이벤트가 먹히는데 잠금화면에 이미지뷰가 나오지 않습니다.


위에 사진에 시계모양이 제가 띄운 이미지이고 옆에 SOS누르미라는 어플의 위젯기능인데
잠금화면 에서 자유자재로 이미지를 이동할 수 있고 꾹 누르면 앱이 실행됩니다.
같은 기능으로 구현을 하고 싶은데 도저히 찾을 수 가 없네요 고수님들 조언 좀 부탁드립니다~~ㅠㅠ