dimanche 19 juin 2016

how to record android click event background

I want to record the android click event when I use other apps. For each click, I record its timestamp. So, this app should run background. I use the "getevent" to catch the click event. I am not very familiar with Android operation. My code has a bug. Its output is not very good, there are many "null"s in the output, and the record is not exactly right.(My app needs root permission)

  • 1.MainActivity.java

    package kingofne.seu.edu.ndktest;

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private EditText editText = null;
        private TextView textView = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            editText = (EditText) findViewById(R.id.editText);
            textView = (TextView) findViewById(R.id.textView);
    
            Button btn_start = (Button) findViewById(R.id.btn_start);
            if (btn_start != null) {
                btn_start.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent();
                        intent.setClass(getApplicationContext(), MyService.class);
                        int param = 1;
                        if (editText != null) {
                            param = Integer.valueOf(String.valueOf(editText.getText()));
                        }
                        intent.putExtra("param", param);
                        startService(intent);
                        Toast.makeText(getApplicationContext(), "start", Toast.LENGTH_SHORT).show();
                        textView.setText(String.valueOf(System.currentTimeMillis()));
                    }
                });
            }
    
            Button btn_stop = (Button) findViewById(R.id.btn_stop);
            if (btn_stop != null) {
                btn_stop.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent();
                        intent.setClass(getApplicationContext(), MyService.class);
                        stopService(intent);
                        Toast.makeText(getApplicationContext(), "stop", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    }
    

2.MyService.java

package kingofne.seu.edu.ndktest;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyService extends Service {
    private boolean isRunning = false;
    private int param = 1;   
    private Thread captureThread = null;
    private volatile boolean doCapture = false;
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (isRunning) {
            return START_NOT_STICKY;
        }

        param = intent.getIntExtra("param", 1);
        this.captureThread = new Thread(new Producer());
        captureThread.setDaemon(true);

        this.doCapture = true;
        captureThread.start();

        isRunning = true;

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // stop the thread
        this.doCapture = false;

        // destroy the thread
        this.captureThread = null;
    }

    private class Producer implements Runnable {

        public void run() {
            Log.d("ps", "going to run");
            Date now = new Date();
            SimpleDateFormat sDateFormat = new SimpleDateFormat(
                    "yyyy-MM-dd-HH-mm-ss");
            String str2 = sDateFormat.format(now);
            // String location = str2;
            //String cmdLine = "getevent -t -l /dev/input/event" + String.valueOf(param) + " > /sdcard/guo"  + ".txt";
            String cmdLine = "cat /dev/input/event" + String.valueOf(param) + " > /sdcard/guo.txt";
            CMDExecute cmd = new CMDExecute();
            try {
                // cmd.run_su("getevent -t > /sdcard/Yang_"+location+".txt");
                cmd.run_su(cmdLine);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.d("ps", "error");
                e.printStackTrace();
            }
        }
    };


    class CMDExecute {

        public synchronized String run(String[] cmd, String workdirectory)
                throws IOException {
            String result = "";
            try {
                ProcessBuilder builder = new ProcessBuilder(cmd);
                BufferedReader in = null;
                // 设置一个路径
                if (workdirectory != null) {
                    builder.directory(new File(workdirectory));
                    builder.redirectErrorStream(true);
                    Process process = builder.start();
                    process.waitFor();
                    in = new BufferedReader(new InputStreamReader(process
                            .getInputStream()));
                    char[] re = new char[1024];
                    int readNum;
                    while ((readNum = in.read(re, 0, 1024)) != -1) {
                        // re[readNum] = '�';
                        result = result + new String(re, 0, readNum);
                    }
                }
                if (in != null) {
                    in.close();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            return result;
        }

        public synchronized String run_su(String cmd)
                throws IOException {
            String result = "";
            Process p=null;
            try {
                p = Runtime.getRuntime().exec("su");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    DataOutputStream os = new DataOutputStream(p.getOutputStream());
    BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream()));
      try {
                String istmp;
                os.writeBytes(cmd+"n");
                //os.writeBytes("exitn");
                os.flush();

                os.writeBytes("exitn");
                os.flush();
                p.waitFor();
                is.close();
                os.close();
                p.destroy();
            } catch (Exception e) {
                // TODO Auto-generated catch block
          e.printStackTrace();
            } return result;
}
}
}

Aucun commentaire:

Enregistrer un commentaire