Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中记录屏幕未显示在应用程序外部的权限_Android_Android Widget_Android Permissions_Android Windowmanager - Fatal编程技术网

在android中记录屏幕未显示在应用程序外部的权限

在android中记录屏幕未显示在应用程序外部的权限,android,android-widget,android-permissions,android-windowmanager,Android,Android Widget,Android Permissions,Android Windowmanager,我正在开发一个简单的屏幕录制应用程序,它运行良好。 我还创建了一个浮动小部件,当用户打开应用程序以及应用程序在后台运行时,它会出现 当我在应用程序中按下浮动小部件时,每次都会出现下面的对话框,如果我按下yes,它就会开始录制,我从google play商店下载的应用程序也会出现同样的情况 但是当我走出我的应用程序时,如果我再次按下浮动小部件,它不会弹出上面的对话框,而我从play store下载的应用程序会弹出。我注意到我从play store下载的应用程序的浮动部件隐藏了显示权限对话框的内容

我正在开发一个简单的屏幕录制应用程序,它运行良好。 我还创建了一个浮动小部件,当用户打开应用程序以及应用程序在后台运行时,它会出现

当我在应用程序中按下浮动小部件时,每次都会出现下面的对话框,如果我按下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的检查