我正在创建一个自动化应用程序,其中我必须实时存储其他应用程序主页的屏幕截图。
我有以下问题语句..
假设我有一个应用程序A和应用B。我希望我的应用A每天在指定的时间每天定期打开应用B,并捕获屏幕截图并关闭该应用程序,并在均值中访问应用程序中的屏幕截图A(或到某些服务器并访问应用程序a)并创建创纪录的一天的明智。
您可以帮助我进行此过程以使事情自动化事物而不使用按钮?
关键挑战
- 从应用程序上的活动导航到无需按钮即可打开应用B(如调度程序)。
- 同时在图库中获取屏幕截图并将其上传到服务器。
- 在将图片上传到服务器后,关闭此应用程序并将控件返回应用程序。
由于问题陈述反映了间谍意图,我认为我提供的解决方案并非用于侵犯潜在用户的任何隐私或个人数据。
我们将根据要求一一逐一转。
-
从您的应用程序启动另一个应用程序:您应该知道要打开的应用程序名称。如果您想让这种动态。这是列出设备上安装的所有应用程序的代码。
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 }
-
以周期性的间隔自动化任务:将此代码放入用户设置警报的活动中。
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 ); }
权限更新清单:
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
-
将应用程序打开的屏幕截图:这是不可能通过API引起隐私问题的。我们将使用Chathead类似服务尝试一下。它们作为服务运行,并使用窗口绘制小部件和布局。因此,窗口布局可用于捕获屏幕截图。转到此博客文章,学习如何创建Chatheads。在这种情况下,Chathead的主要目的是捕获屏幕截图。现在使用屏幕截图使用以下代码:
Bitmap bitmap; View v1 = //Your root layout after inflating to WindowManager v1.setDrawingCacheEnabled(true); bitmap = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false);
-
存储并发送到服务器:
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(); }
您可以使用诸如凌空或改造之类的任何库将此文件发送到服务器。这是示例的链接。
我希望这能解决您的陈述中的大多数问题。我可能已经跳过了一些常见的内容,例如文件读写的许可。请包含这些内容,因为我没有运行代码并尝试过。
您可以使用以下方法
- 创建粘性服务。
- 创建一个pendingIntent AlarmManager的组合,该组合每天都会在巨型时间运行上述服务。
- 该服务将打开APPB并进行屏幕截图。
- 完成后,该服务将关闭AppB。
- 然后,它将获取图像并将其上传到服务器上。
- 上传成功后,服务将停止并更新警报器。
每天都会重复。
不确定这是否有效,但是您可以尝试
希望这会有所帮助。:)