在android中记录屏幕未显示在应用程序外部的权限
我正在开发一个简单的屏幕录制应用程序,它运行良好。 我还创建了一个浮动小部件,当用户打开应用程序以及应用程序在后台运行时,它会出现 当我在应用程序中按下浮动小部件时,每次都会出现下面的对话框,如果我按下yes,它就会开始录制,我从google play商店下载的应用程序也会出现同样的情况 但是当我走出我的应用程序时,如果我再次按下浮动小部件,它不会弹出上面的对话框,而我从play store下载的应用程序会弹出。我注意到我从play store下载的应用程序的浮动部件隐藏了显示权限对话框的内容 下面是我的服务类,它显示了浮动小部件在android中记录屏幕未显示在应用程序外部的权限,android,android-widget,android-permissions,android-windowmanager,Android,Android Widget,Android Permissions,Android Windowmanager,我正在开发一个简单的屏幕录制应用程序,它运行良好。 我还创建了一个浮动小部件,当用户打开应用程序以及应用程序在后台运行时,它会出现 当我在应用程序中按下浮动小部件时,每次都会出现下面的对话框,如果我按下yes,它就会开始录制,我从google play商店下载的应用程序也会出现同样的情况 但是当我走出我的应用程序时,如果我再次按下浮动小部件,它不会弹出上面的对话框,而我从play store下载的应用程序会弹出。我注意到我从play store下载的应用程序的浮动部件隐藏了显示权限对话框的内容
public class FloatingViewService extends Service {
private WindowManager mWindowManager;
private View mFloatingView;
public static final String BROADCAST_ACTION = "com.mukesh.service";
public FloatingViewService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
//Inflate the floating view layout we created
mFloatingView = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget, null);
//Add the view to the window.
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
// WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
//Specify the view position
params.gravity = Gravity.TOP | Gravity.LEFT; //Initially view will be added to top-left corner
params.x = 0;
params.y = 100;
//Add the view to the window
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingView, params);
//….
//….
//The root element of the collapsed view layout
final View collapsedView = mFloatingView.findViewById(R.id.collapse_view);
//The root element of the expanded view layout
final View expandedView = mFloatingView.findViewById(R.id.expanded_container);
//Set the close button
ImageView closeButtonCollapsed = (ImageView) mFloatingView.findViewById(R.id.close_btn);
closeButtonCollapsed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//close the service and remove the from from the window
stopSelf();
}
});
//Set the view while floating view is expanded.
//Set the start recording button.
ImageView playButton = (ImageView) mFloatingView.findViewById(R.id.startRecording);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(FloatingViewService.this, "Recording started", Toast.LENGTH_LONG).show();
//serviceCallbacks.onClick(1);
Intent temp = new Intent(BROADCAST_ACTION);
temp.putExtra("type" , 1);
sendBroadcast(temp);
}
});
//stop recording.
ImageView nextButton = (ImageView) mFloatingView.findViewById(R.id.stopRecording);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(FloatingViewService.this, "recording stoped.", Toast.LENGTH_LONG).show();
Intent temp = new Intent(BROADCAST_ACTION);
temp.putExtra("type" , 2);
sendBroadcast(temp);
}
});
//Set the close button
ImageView closeButton = (ImageView) mFloatingView.findViewById(R.id.close_button);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
collapsedView.setVisibility(View.VISIBLE);
expandedView.setVisibility(View.GONE);
}
});
//Drag and move floating view using user's touch action.
mFloatingView.findViewById(R.id.root_container).setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//remember the initial position.
initialX = params.x;
initialY = params.y;
//get the touch location
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
int Xdiff = (int) (event.getRawX() - initialTouchX);
int Ydiff = (int) (event.getRawY() - initialTouchY);
//The check for Xdiff <10 && YDiff< 10 because sometime elements moves a little while clicking.
//So that is click event.
if (Xdiff < 10 && Ydiff < 10) {
if (isViewCollapsed()) {
//When user clicks on the image view of the collapsed layout,
//visibility of the collapsed layout will be changed to "View.GONE"
//and expanded view will become visible.
collapsedView.setVisibility(View.GONE);
expandedView.setVisibility(View.VISIBLE);
}
}
return true;
case MotionEvent.ACTION_MOVE:
//Calculate the X and Y coordinates of the view.
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
//Update the layout with new X & Y coordinate
mWindowManager.updateViewLayout(mFloatingView, params);
return true;
}
return false;
}
});
}
private boolean isViewCollapsed() {
return mFloatingView == null || mFloatingView.findViewById(R.id.collapse_view).getVisibility() == View.VISIBLE;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mFloatingView != null) mWindowManager.removeView(mFloatingView);
}
}
public类FloatingViewService扩展服务{
专用窗口管理器mWindowManager;
私有视图mFloatingView;
公共静态最终字符串广播\u ACTION=“com.mukesh.service”;
公共浮动视图服务(){
}
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
super.onCreate();
//膨胀我们创建的浮动视图布局
mFloatingView=LayoutInflater.from(this).充气(R.layout.layout\u floating\u小部件,null);
//将视图添加到窗口中。
final WindowManager.LayoutParams params=新建WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_内容,
WindowManager.LayoutParams.WRAP_内容,
//WindowManager.LayoutParams.TYPE_电话,
WindowManager.LayoutParams.TYPE\u应用程序\u覆盖,
WindowManager.LayoutParams.FLAG\u不可聚焦,
像素格式(半透明);
//指定视图位置
params.gravity=gravity.TOP | gravity.LEFT;//最初视图将添加到左上角
参数x=0;
参数y=100;
//将视图添加到窗口中
mWindowManager=(窗口管理器)getSystemService(窗口服务);
mWindowManager.addView(mFloatingView,params);
//….
//….
//折叠视图布局的根元素
最终视图collapsedView=mFloatingView.findViewById(R.id.collapsedView);
//展开视图布局的根元素
最终视图expandedView=mFloatingView.findViewById(R.id.expanded_容器);
//设置关闭按钮
ImageView closeButtonCollapsed=(ImageView)mFloatingView.findViewById(R.id.close_btn);
closeButtonCollapsed.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//关闭服务并从窗口中卸下
stopSelf();
}
});
//在展开浮动视图时设置视图。
//设置开始录制按钮。
ImageView播放按钮=(ImageView)mFloatingView.findViewById(R.id.startRecording);
playButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//Toast.makeText(FloatingViewService.this,“录制已开始”,Toast.LENGTH_LONG.show();
//serviceCallbacks.onClick(1);
意图温度=新意图(广播动作);
额外温度(“类型”,1);
发送广播(临时);
}
});
//停止录音。
ImageView下一个按钮=(ImageView)mFloatingView.findViewById(R.id.stopRecording);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//Toast.makeText(FloatingViewService.this,“录制已停止。”,Toast.LENGTH_LONG.show();
意图温度=新意图(广播动作);
额外温度(“类型”,2);
发送广播(临时);
}
});
//设置关闭按钮
ImageView关闭按钮=(ImageView)mFloatingView.findViewById(R.id.close_按钮);
closeButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
collapsedView.setVisibility(View.VISIBLE);
expandedView.setVisibility(View.GONE);
}
});
//使用用户的触摸操作拖动和移动浮动视图。
mFloatingView.findViewById(R.id.root_容器).setOnTouchListener(新视图.OnTouchListener(){
私有int initialX;
私有int初始值;
私有浮点数;
私家侦探敏感;
@凌驾
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
//记住初始位置。
initialX=参数x;
初始值y=参数y;
//获取触摸位置
initialTouchX=event.getRawX();
initialTouchY=event.getRawY();
返回true;
case MotionEvent.ACTION\u UP:
int Xdiff=(int)(event.getRawX()-initialTouchX);
int-Ydiff=(int)(event.getRawY()-initialTouchY);
//Xdiff的检查