android– 除了要求许可外,如何在不干扰当前前台进程的情况下获得媒体投影管理器?

android– 除了要求许可外,如何在不干扰当前前台进程的情况下获得媒体投影管理器?,第1张

概述问题:我有一个屏幕截图应用程序,它使用浮动覆盖服务进行控制,并使用屏幕转换API媒体项目管理器来访问屏幕.有时当设备内存不足时,Android重新启动服务,我丢失了媒体投影.我知道重新获取新媒体投影的唯一方法是重新打开请求权限的活动,这将是它的结束,除了一个问题.某些应用程序,特

问题:我有一个屏幕截图应用程序,它使用浮动覆盖服务进行控制,并使用屏幕转换API媒体项目管理器来访问屏幕.有时当设备内存不足时,Android重新启动服务,我丢失了媒体投影.

我知道重新获取新媒体投影的唯一方法是重新打开请求权限的活动,这将是它的结束,除了一个问题.某些应用程序,特别是游戏,似乎在丢失前台进程,暂停或以其他方式重置时进行侦听.这很烦人.

这是我理想的场景.服务打开,如果用户在权限请求对话框中选择了“已检查不再询问我”,则会以不干扰当前前台活动的方式获取媒体投影.

如何在不干扰当前前台进程的情况下获得媒体投影管理器?

是否有办法从直接服务获取媒体投影,或者从服务中在后台打开活动?

目前我在Activity中使用此代码来获取媒体投影管理器

    @TargetAPI(Build.VERSION_CODES.LolliPOP)protected voID getScreenShotPermission() {    if(isLollipopOrNewer) {        mediaprojectionmanager = (mediaprojectionmanager) getContext().getSystemService(MEDIA_PROJECTION_SERVICE);        startActivityForResult(mediaprojectionmanager.createScreenCaptureIntent(), 1);    }}@TargetAPI(Build.VERSION_CODES.LolliPOP)@OverrIDepublic voID onActivityResult(int requestCode, int resultCode, Intent data) {    if (requestCode == 1) {        if (resultCode == Activity.RESulT_OK) {            mediaProjection = mediaprojectionmanager.getMediaProjection(resultCode, data);            this.finish();        }    }}

解决方法:

所以我回到这里因为它是愚蠢的,这让我烦恼,我想出来了!

在另一个类(在我的应用程序类中)放置此代码:

private static Intent screenshotPermission = null;protected static voID getScreenshotPermission() {    try {        if (hasScreenshotPermission()) {            if(null != mediaProjection) {                mediaProjection.stop();                mediaProjection = null;            }            mediaProjection = mediaprojectionmanager.getMediaProjection(Activity.RESulT_OK, (Intent) screenshotPermission.clone());         } else {            openScreenshotPermissionRequester();        }    } catch (final RuntimeException ignored) {        openScreenshotPermissionRequester();    }}protected static voID openScreenshotPermissionRequester(){    final Intent intent = new Intent(context, AcquireScreenshotPermissionIntent.class);    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    context.startActivity(intent);}protected static voID setScreenshotPermission(final Intent permissionIntent) {    screenshotPermission = permissionIntent;}

在您的活动类中处理初始请求(在我的情况下:AcquireScreenshotPermissionIntent)将此代码放入您的onactivityresult:

@OverrIDepublic voID onActivityResult(final int requestCode, final int resultCode, final Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (1 == requestCode) {        if (Activity.RESulT_OK == resultCode) {            setScreenshotPermission((Intent) data.clone());        }    } else if (Activity.RESulT_CANCELED == resultCode) {        setScreenshotPermission(null);        log("no access");    }    finish();

只要您需要权限,只需调用getScreenShotPermission(),然后使用生成的mediaProjection对象.

以下是它的工作原理:魔术标记是Intent中包含的一些数据.我最初尝试的是将结果意图放在一个全局变量中,并使用它来创建非活动类的媒体投影.问题是它会失败.我最终想到的是,当您使用它创建媒体投影时,令牌会消耗掉.将它作为参数传递或分配给一个新变量只是传递一个指向它的指针,它仍然被消耗.

你需要做的是使用object.clone();.这使得令牌的新副本,新副本被消耗,并且您可以根据需要创建其他令牌,只要您不使用原始令牌即可.作为奖励,您的应用程序每次启动时只需要请求一次屏幕截图.如果有其他东西接管了截屏视频,或者AndroID内存管理器得到了你,你就会被覆盖.您可以创建新的虚拟屏幕,而无需将onPause或onStop事件发送到其他应用程序.

总结

以上是内存溢出为你收集整理的android – 除了要求许可外,如何在不干扰当前前台进程的情况下获得媒体投影管理器?全部内容,希望文章能够帮你解决android – 除了要求许可外,如何在不干扰当前前台进程的情况下获得媒体投影管理器?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1102668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存