从Android活动中打开不同的应用程序并获取和存储屏幕截图

时间:2016-12-21 07:44:17

标签: android

我正在创建一个自动化应用程序,我必须实时存储其他应用程序主页的屏幕截图。

我有以下问题陈述..

假设我有一个应用程序A和应用程序B.我希望我的应用程序A应该在指定时间每天定期打开应用程序B并捕获屏幕截图并关闭该应用程序并在平均值同时获取应用程序A中的屏幕截图(或某些服务器以及给予应用程序A的访问权限并创建一天的记录。

您可以帮助我完成不使用按钮自动化的过程吗?

主要挑战

  1. 从应用A上的活动导航到打开应用B,无需点击按钮(如调度程序)。
  2. 同时截取屏幕截图并从图库中提取并将其上传到服务器。
  3. 关闭此应用,并在照片上传到服务器后立即将控制权交还给应用A.

2 个答案:

答案 0 :(得分:1)

您可以使用以下方法

  1. 创建一个粘性服务。
  2. 在PendingIntent + AlarmManager上创建一个组合,该组合将在每天的特定时间运行上述服务。
  3. 该服务将打开appB并截取屏幕截图。
  4. 完成后,该服务将关闭appB。
  5. 然后它将获取图像并将其上传到服务器上。
  6. 上传成功后,服务将停止并更新AlarmManager。
  7. 每天都会重复。

    不确定这是否有效,但您可以尝试

    希望这会有所帮助。 :)

答案 1 :(得分:1)

由于问题陈述反映了间谍意图,我认为我提供的解决方案不会用于侵犯潜在用户的任何隐私或个人数据。

我们将根据要求逐一进行。

  1. 从您的应用中启动另一个应用:您应该知道要打开的应用的包名称。如果你想让这个充满活力。这是列出设备上安装的所有应用的代码。

    final PackageManager pm = getPackageManager();
    //get a list of installed apps.
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    
    for (ApplicationInfo packageInfo : packages) {
        Log.d(TAG, "Installed package :" + packageInfo.packageName);
        Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
        Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); 
    }
    

    您在此处检索的包名称可用于启动相应应用程序的主要活动。这是相同的代码:

    Intent launchIntent = getPackageManager().getLaunchIntentForPackage("Enter package name here");
    if (launchIntent != null) { 
        startActivity(launchIntent);//null pointer check in case package name was not found
    }
    
  2. 定期自动执行任务:将此代码放入用户设置闹钟的活动中。

    public void setAlarm(){
    
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override public void onReceive( Context context, Intent _ )
            {
                //launch application and screenshot code here
                context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
            }
        };
    
        this.registerReceiver( receiver, new IntentFilter("any_custom_message") );
    
        PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("custom_message_used_above"), 0 );
        AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));
    
        // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime())
        manager.set( AlarmManager.RTC_WAKEUP, 10*60*60 //10 minutes in millis, pintent );
    }
    

    更新Manifest权限:

    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
    
  3. 截取已打开的应用的屏幕截图:这不可能通过API,因为它可能会导致隐私问题。我们将尝试使用chathead类似的服务。它们作为服务运行,并使用Window来绘制小部件和布局。因此,窗口布局可用于捕获屏幕截图。转到此blog post,了解如何创建聊天头。在这种情况下,聊天头不应该有任何设计,因为它的主要目的是捕获屏幕截图。现在截取屏幕截图使用以下代码:

    Bitmap bitmap;
    View v1 = //Your root layout after inflating to WindowManager
    v1.setDrawingCacheEnabled(true);
    bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);
    
  4. 存储并发送到服务器

    String mPath = Environment.getExternalStorageDirectory().toString() + "/" +  YOUR_DIRECTORY_NAME;
    OutputStream fout = null;
    imageFile = new File(mPath);
    
    try {
        fout = new FileOutputStream(imageFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
        fout.flush();
        fout.close();
    
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    您可以使用Volley或retrofit等任何库将此文件发送到服务器。这是example

  5. 的链接

    我希望这能解决你的陈述中的大部分问题。我可能已经跳过了一些常见的东西,比如文件读写权限。请包括那些因为我没有运行代码并尝试过。