RK3562 安卓13 安卓14 三指截屏功能实现

diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index fb38bba8ee16..90b6d5201257 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -127,6 +127,14 @@ import com.android.internal.widget.DecorContentParent;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
+// liujunjie add 
+import com.android.internal.util.ScreenshotHelper;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.content.ServiceConnection;
+import android.content.ComponentName;
+import java.util.Arrays;
 
 /**
  * Android-specific Window.
@@ -350,10 +358,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
     }
 
     static final RotationWatcher sRotationWatcher = new RotationWatcher();
+    private Context mContext;
 
     @UnsupportedAppUsage
     public PhoneWindow(@UiContext Context context) {
         super(context);
+	this.mContext = context;
         mLayoutInflater = LayoutInflater.from(context);
         mRenderShadowsInCompositor = Settings.Global.getInt(context.getContentResolver(),
                 DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR, 1) != 0;
@@ -1902,8 +1912,128 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
 
     @Override
     public boolean superDispatchTouchEvent(MotionEvent event) {
+		parse3PointerScreenShot(event); // liujunjie add 
+		
         return mDecor.superDispatchTouchEvent(event);
     }
+	
+	private static final int MAX_POINTER = 10;
+    private static final float Y_OFFSET = 150;
+    private boolean is3Pointer = false;
+    private float downY[] = new float[MAX_POINTER];
+    private float upY[] = new float[MAX_POINTER];
+    private float matchY[] = new float[MAX_POINTER];
+	// liujunjie add ssr 
+    private void clearArrayData(float[] data) {
+        Arrays.fill(data, 0);
+    }
+	private void parse3PointerScreenShot(MotionEvent ev) {
+        int pointerCount = ev.getPointerCount();
+        //android.util.Log.d("liujunjie33","parse3PointerScreenShot  actionMasked: "+ actionMasked +" ,pointerCount:"+pointerCount);
+		if(pointerCount != 3){
+			return;
+		}
+        int value = Settings.System.getInt(mContext.getContentResolver(), "screenshot_pointer", 0);
+        if (value != 0) {
+            return ;
+        }
+		int actionMasked = ev.getActionMasked();
+        if (pointerCount == 3) {
+            switch (actionMasked) {
+                case MotionEvent.ACTION_POINTER_DOWN:
+                    for (int i = 0; i < pointerCount; i++) {
+                        int pointerId = ev.getPointerId(i);
+                        downY[pointerId] = ev.getY(i);
+                    }
+                    is3Pointer = true;
+                    break;
+                case MotionEvent.ACTION_POINTER_UP:
+                    if (is3Pointer) {
+                        for (int i = 0; i < pointerCount; i++) {
+                            int pointerId = ev.getPointerId(i);
+                            upY[pointerId] = ev.getY(i);
+                            matchY[pointerId] = Math.abs(upY[pointerId] - downY[pointerId]);
+                        }
+                    } else {
+                        clearArrayData(downY);
+                        clearArrayData(upY);
+                        clearArrayData(matchY);
+                    }
+                    break;
+            }
+            boolean[] flag = new boolean[] {false, false, false};
+            for (int i = 0; i < pointerCount; i++) {
+                int pointerId = ev.getPointerId(i);
+                if (matchY[pointerId] > Y_OFFSET) {
+                    flag[i] = true;
+                    matchY[pointerId] = 0;
+                }
+            }
+            if (flag[0] && flag[1] && flag[2]) {
+                 h.sendEmptyMessage(HAND_SCREENSHOT);
+            }
+        } else {
+            is3Pointer = false;
+        }
+    }
+	private final static int  HAND_SCREENSHOT = 7;
+	// liujunjie add 
+	private final ComponentName cn = new ComponentName("com.android.systemui",
+            "com.android.systemui.screenshot.TakeScreenshotService");
+
+    private void myBindService() {
+        Intent intent = new Intent();
+        intent.setComponent(cn);
+       mContext.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
+
+    }
+    private Messenger messenger = null;
+    private final Handler h = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what){
+                case HAND_SCREENSHOT:
+                    senPostRequest();
+                    break;
+            }
+            Log.d(TAG, "handleMessage: -------------msg:"+msg.what);
+        }
+    };
+    private void senPostRequest(){
+        if (messenger != null){
+            try {
+                Message msg = Message.obtain(null, 1);
+                msg.replyTo = new Messenger(h);
+                msg.arg1 = msg.arg2 = 0;
+                msg.obj = screenshotRequest;
+                messenger.send(msg);
+            } catch (RemoteException e) {
+                messenger = null;
+                throw new RuntimeException(e);
+            }
+        }else {
+            myBindService();
+        }
+    }
+    private final ScreenshotHelper.ScreenshotRequest screenshotRequest =
+            new ScreenshotHelper.ScreenshotRequest(1,2,new ComponentName("com.example.myapplication","com.example.myapplication.FullActivity2"));
+    private final ServiceConnection serviceConnection = new ServiceConnection() {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            Log.d(TAG, "onServiceConnected: ");
+            messenger = new Messenger(service);
+            senPostRequest();
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            Log.d(TAG, "onServiceDisconnected: ");
+            messenger = null;
+
+        }
+    };
+	
+	// liujunjie add end 
 
     @Override
     public boolean superDispatchTrackballEvent(MotionEvent event) {
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 2737ecf5ffa6..09771fe1e883 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -378,9 +378,8 @@
         <!-- started from PhoneWindowManager
              TODO: Should have an android:permission attribute -->
         <service android:name=".screenshot.TakeScreenshotService"
-            android:permission="com.android.systemui.permission.SELF"
             android:process=":screenshot"
-            android:exported="false" />
+            android:exported="true" />
 
         <!-- Called from PhoneWindowManager -->
         <receiver android:name=".screenshot.ScreenshotServiceErrorReceiver"

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值