我正在创建一个自动化应用程序,我必须实时存储其他应用程序主页的屏幕截图。
我有以下问题陈述..
假设我有一个应用程序A和应用程序B.我希望我的应用程序A应该在指定时间每天定期打开应用程序B并捕获屏幕截图并关闭该应用程序并在平均值同时获取应用程序A中的屏幕截图(或某些服务器以及给予应用程序A的访问权限并创建一天的记录。
您可以帮助我完成不使用按钮自动化的过程吗?
主要挑战
答案 0 :(得分: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
}
定期自动执行任务:将此代码放入用户设置闹钟的活动中。
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>
截取已打开的应用的屏幕截图:这不可能通过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);
存储并发送到服务器:
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。
我希望这能解决你的陈述中的大部分问题。我可能已经跳过了一些常见的东西,比如文件读写权限。请包括那些因为我没有运行代码并尝试过。