- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
问题:我有一个屏幕截图应用程序,它使用 float 覆盖服务进行控制,并使用屏幕转换 API 媒体项目管理器来访问屏幕。有时,当设备内存不足时,Android 会重新启动服务,而我会丢失媒体投影。
我所知道的重新获取新媒体投影的唯一方法是重新打开请求权限的 Activity,这将结束,除了一个问题。某些应用程序,尤其是游戏,似乎会在失去前台进程、暂停或以其他方式重置时进行监听。这很烦人。
这是我理想中的场景。服务打开,如果用户在权限请求对话框中选择了“选中不要再问我”,它会以不干扰当前前台 Activity 的方式获取媒体投影。
如何在不打扰当前前台进程的情况下获取媒体投影管理器?
是否有办法从直接服务获取媒体投影,或从服务在后台打开 Activity ?
目前我在 Activity 中使用这段代码来获取 MediaProjectionManager
@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)
@Override
public 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;
}
在您处理初始请求的 Activity 类中(在我的例子中:AcquireScreenshotPermissionIntent)将此代码放入您的 onactivityresult 中:
@Override
public 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 对象即可。
它是这样工作的:魔法 token 是 Intent 中包含的一些数据。我最初尝试的是将结果 Intent 放入一个全局变量,并使用它从非 Activity 类创建媒体投影。问题是它会失败。我最终发现,当您使用它创建媒体投影时, token 会被消耗掉。将它作为参数传递或分配给一个新变量只是传递一个指向它的指针,它仍然会被消耗。
您需要做的是使用 object.clone();。这会创建 token 的新副本,新副本会被使用,并且您可以根据需要创建其他 token ,只要您不使用原始 token 即可。作为奖励,您的应用每次启动时只需请求一次屏幕截图许可。如果有其他东西接管了截屏视频,或者 Android 内存管理器控制了您,那么您就可以了。您可以创建一个新的虚拟屏幕,而无需向其他应用发送 onPause 或 onStop 事件。
关于android - 除了请求许可外,如何在不干扰当前前台进程的情况下获取 MediaProjectionManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33398211/
我想构建一个必须在服务中使用 MediaProjectionManager 的应用程序。但我无法解决它,因为“startActivityForResult”不能在服务类中使用。 最佳答案 我真的很想通
我根据MediaProjectionManager开始截屏 Intent : var intent = mediaProjectionManager.createScreenCaptureIntent
问题:我有一个屏幕截图应用程序,它使用 float 覆盖服务进行控制,并使用屏幕转换 API 媒体项目管理器来访问屏幕。有时,当设备内存不足时,Android 会重新启动服务,而我会丢失媒体投影。 我
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivit
我正在开发一个 android 项目,其中还有一个位于其他应用程序之上的叠加按钮,当单击此按钮时,应截取屏幕截图。叠加按钮有效,但屏幕截图部分无效。我不知道为什么,但似乎 OnImageAvailab
MediaProjectionManager manager = (MediaProjectionManager) activity.getSystemService(MEDIA_PR
我是一名优秀的程序员,十分优秀!