ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

安卓按键辅助(类似按键精灵)

2020-04-09 21:03:51  阅读:364  来源: 互联网

标签:int 安卓 按键精灵 TAG 按键 import android null public


 

无障碍 和截图 功能 root的手机就不说了

 

无障碍:

package com.yangdc.auto.games.stzb;


import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.GestureDescription;
import android.accessibilityservice.GestureDescription.StrokeDescription;
import android.graphics.Path;
import android.os.Build;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;

import androidx.annotation.RequiresApi;

import com.blankj.utilcode.util.ToastUtils;


public class MyAccessibilityService extends AccessibilityService {

    final String TAG = "Ydc";

    public static MyAccessibilityService mService;
    public static boolean isStart() {
        return  mService != null;
    }

    @Override
    public void onInterrupt() {
    }
    @Override
    public void onServiceConnected() {
        mService = this;
        //初始化
        super.onServiceConnected();
        ToastUtils.showShort("无障碍已开启");
    }
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        mService = this;
    }
    public Boolean keyevent(int action)  {
        Log.d(TAG, "按下:" + action);
        return this.performGlobalAction(action);
    }


    @RequiresApi(api = Build.VERSION_CODES.N)
    public void dispatchGestureClick(int x, int y){
        Path path=new Path();
        path.moveTo(x, y);

        GestureDescription.Builder builder = new GestureDescription.Builder();
        builder.addStroke(new StrokeDescription(path, 10, 100));
        GestureDescription gestureDescription = builder.build();
        dispatchGesture(gestureDescription,null,null);
        Log.d(TAG,"点击坐标 " + x + " " + y);

    }

    public void swipe(int x1,int y1,int x2,int y2,int time){
        Path path=new Path();
        path.moveTo(x1, y1);
        path.lineTo(x2,y2);
        GestureDescription.Builder builder = new GestureDescription.Builder();
        builder.addStroke(new StrokeDescription(path, 10, time));
        GestureDescription gestureDescription = builder.build();
        dispatchGesture(gestureDescription,null,null);
        Log.d(TAG,"滑动 " + x1 + " " + y1 + " " + x2 + "  "+ y2);
    }

}

  

截图:

package com.yangdc.auto.games.stzb;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.Image;
import android.media.ImageReader;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import com.blankj.utilcode.util.ImageUtils;

import java.nio.ByteBuffer;

import static android.media.ImageReader.*;

public class ImageReaderService extends Service {
    public static ImageReaderService service;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    int width;
    int height;
    int dpi;
    ImageReader imageReader;
    MediaProjection mediaProjection;
    MediaProjectionManager projectionManager;
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        service = this;
        Log.d(TAG, "onStartCommand()");
        setForeground();
        DisplayMetrics metric = new DisplayMetrics();

        MainActivity.Main.getWindowManager().getDefaultDisplay().getMetrics(metric);
        width = metric.widthPixels;
        height = metric.heightPixels + MainActivity.Main.getStatusBarHeight();
        dpi = metric.densityDpi;

        int     resultCode = intent.getIntExtra("code", -1);
        Intent   data = intent.getParcelableExtra("data");
        projectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);

        mediaProjection = projectionManager.getMediaProjection(resultCode,data);
        return super.onStartCommand(intent,flags,startId);
    }
    private static final String TAG="MyService";
    private static final String ID="channel_1";
    private static final String NAME="前台服务";
    boolean isOk = false;
    public void setForeground(){
        if (isOk){
            return;
        }
        isOk = true;
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
            return;
        }
        NotificationManager manager=(NotificationManager)getSystemService (NOTIFICATION_SERVICE);
        NotificationChannel channel= null;
        channel = new NotificationChannel(ID,NAME, NotificationManager.IMPORTANCE_HIGH);

        assert manager != null;
        manager.createNotificationChannel (channel);
        Notification notification= null;
        notification = new Notification.Builder (this,ID)
                .setContentTitle ("收到一条重要通知")
                .setContentText ("这是重要通知")
                .setSmallIcon (R.mipmap.ic_launcher)
                .setLargeIcon (BitmapFactory.decodeResource (getResources (),R.mipmap.ic_launcher))
                .build ();

        startForeground (1,notification);
    }

    public static Bitmap ScreenShot() {

        if (service != null){
            return service.startCapture();
        }
        Log.e(TAG, "没启动服务");
        return null;
    }
    private synchronized Bitmap startCapture() {
        if (imageReader != null){
            return null;
        }
        VirtualDisplay virtualDisplay = null;
        Bitmap  bitmap = null;
        imageReader = newInstance(width, height, PixelFormat.RGBA_8888, 1);
        Log.d(TAG,"dpi" + dpi);
        virtualDisplay = mediaProjection.createVirtualDisplay("ScreenShout",
                width,height,dpi,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                imageReader.getSurface(),null,null);
        try {


            Image image = null;
            int times = 0;
            do {
                times++;
                SystemClock.sleep(100);
                image = imageReader.acquireNextImage();
                if (image != null){
                    break;
                }
            }while (times < 2000);

            if (image != null){

            Log.d(TAG,"新图片");
            int width = image.getWidth();
            int height = image.getHeight();
            final Image.Plane[] planes = image.getPlanes();
            final ByteBuffer buffer = planes[0].getBuffer();
            int pixelStride = planes[0].getPixelStride();
            int rowStride = planes[0].getRowStride();
            int rowPadding = rowStride - pixelStride * width;
            bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
            bitmap.copyPixelsFromBuffer(buffer);
           Bitmap  bitmap1 = Bitmap.createBitmap(bitmap, 0, 0,width, height);
           bitmap = bitmap1;
            Log.d(TAG,bitmap.getByteCount()+"bitmap.getByteCount()" + "rowPadding / pixelStride" + (rowPadding / pixelStride));


            }else{
                Log.d(TAG,"图片 为空");
            }

            if (image != null) {
                image.close();
            }

        }catch (Exception ignored){
        }finally {
            if (imageReader != null) {
                imageReader.discardFreeBuffers();
            }
            imageReader.close();
            imageReader = null;
            if (virtualDisplay != null){
                virtualDisplay.release();
                virtualDisplay = null;
            }
        }
        return bitmap;
    }
}

  

 

然后是C# adb 已经算是root了 所以也没啥可说的

 

完整代码可以看 

https://gitee.com/yangdc/AutoAndroid

高版本坑还是很多的   码云项目没整理是 开发学习过程

项目实现了不少自用功能.....很实用 但是不大众化  使用起来 需要一定的理解才行不是傻瓜式的

 

标签:int,安卓,按键精灵,TAG,按键,import,android,null,public
来源: https://www.cnblogs.com/yangdc/p/12669508.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有