Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:打开并阅读另一个应用程序位置_Java_Android_Kotlin_Adb - Fatal编程技术网

Java Android:打开并阅读另一个应用程序位置

Java Android:打开并阅读另一个应用程序位置,java,android,kotlin,adb,Java,Android,Kotlin,Adb,我需要开发一个应用程序来监控应用程序列表,如果系统重新启动,则返回到被监控应用程序的最后一个打开页面。所以,假设android在youtube应用程序上播放。我的应用程序如何将android发送回给定的视频?还有,有没有办法让我知道用户在应用程序中的位置?例如,我能知道用户在youtube上播放lofi并再次为他们打开它吗 我已经知道如何打开另一个应用程序以及检测当前打开的应用程序,但我还需要知道它的uri。如果需要,我可以使用adb和shell脚本 我有以下代码来启动另一个应用程序: 类Ma

我需要开发一个应用程序来监控应用程序列表,如果系统重新启动,则返回到被监控应用程序的最后一个打开页面。所以,假设android在youtube应用程序上播放。我的应用程序如何将android发送回给定的视频?还有,有没有办法让我知道用户在应用程序中的位置?例如,我能知道用户在youtube上播放lofi并再次为他们打开它吗

我已经知道如何打开另一个应用程序以及检测当前打开的应用程序,但我还需要知道它的uri。如果需要,我可以使用adb和shell脚本

我有以下代码来启动另一个应用程序:


类MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
intent.setFlags(intent.FLAG\u活动\u新任务)
val intent=intent(这是BackAppListenerService::class.java)
startService(意向)
openApp(这是“com.google.android.youtube”)
}
/**打开另一个应用程序。
*@param context当前上下文,如活动、应用程序或服务
*@param packageName要打开的应用程序的完整程序包名称
*@如果可能成功,则返回true;如果失败,则返回false
*/
有趣的openApp(context:context,packageName:String?):布尔值{
val manager=context.packageManager
回击{
val i=manager.getLaunchIntentForPackage(packageName!!)
如果(i==null){
println(“未找到活动”)
返回false;
//抛出新活动NotFoundException();
}
//抛出新活动NotFoundException();
i、 addCategory(意图.类别\启动器)
背景.起始触觉(i)
真的
}捕获(e:ActivityNotFoundException){
println(e)
假的
}
}
}
有了这个,我得到了当前的前台应用程序


类BackAppListenerService:Service(){
私有变量isRunning=false
private var lastApp=“”
@RequiresApi(Build.VERSION\u code.LOLLIPOP)
重写fun onCreate(){
isRunning=true
意图(设置、操作、使用、访问、设置)
}
override-fun-onstart命令(intent:intent,flags:Int,startId:Int):Int{
//为我的服务创建新线程
//始终在单独的线程中编写长时间运行的任务,以避免出现错误
线程(可运行{
while(true){
试一试{
线程。睡眠(10)
}捕获(e:例外){
}
val currentForegroundApp=getForegroundApp()
val currentApp=currentForegroundApp.first
如果(currentApp!=lastApp){
//新的应用程序在前面
lastApp=currentApp
println(“当前应用程序$lastApp”)
}
}
}).start()
返回起始点
}
//必须具有使用访问权限
趣味getForegroundApp():配对{
var currentApp=“NULL”
var currentAppInfo:UsageStats?=null
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
val usm=this.getSystemService(Context.USAGE\u STATS\u SERVICE)作为usagestastsmanager
val time=System.currentTimeMillis()
瓦尔·阿普利斯特=
usm.queryUsageStats(USAGestasManager.INTERVAL_每日,时间-1000*1000,时间)
如果(appList!=null&&appList.size>0){
val mySortedMap:SortedMap=
树映射()
for(应用程序列表中的usageStats){
mySortedMap.put(usageStats.lastTimeUsed,usageStats)
}
if(mySortedMap!=null&&!mySortedMap.isEmpty()){
currentAppInfo=mySortedMap[mySortedMap.lastKey()]!!
currentApp=mySortedMap[mySortedMap.lastKey()]!!.packageName
}
}
}否则{
val am=此.getSystemService(Context.ACTIVITY_服务)作为ActivityManager
val tasks=am.runningAppProcess
currentApp=任务[0]。进程名称
}
返回对(currentApp.split(“.”.last(),currentAppInfo!!)
}
[...]
}

非常感谢您的任何帮助。

我不确定,但我认为您想要的是不可能的,因为如果应用程序可以任意监控完全无关的应用程序中发生的事情,这会带来各种安全隐患。除了尝试再次打开一个应用程序并希望它恢复其状态外,你也许可以通过捕获隐式意图并重新发送它们来做一些事情——但即使这样做有效,如果用户进行了任何导航,它也可能不会让你回到应用程序中的“同一位置”—是的,我能找到的最好的东西是使用uiautomator获取应用程序的xml模式,但即使如此,要真正找到用户正在观看的内容还是非常困难的。