Android 9+ 上的媒体投影问题
Mediaprojection issues on Android 9+
我制作了一个 OCR 应用程序,它使用 Android mediaprojection 制作屏幕截图并处理该图像中的文本。这工作正常,除了 Android 9+。当 mediaprojeciton 启动时,总是会弹出一个 window 警告,提示可能会记录敏感数据,以及一个取消或开始记录的按钮。我怎样才能实现这个 window 只会显示一次?
我试图通过创建两个额外的私有静态变量来存储 mediaprojection 的意图和结果数据来防止它弹出,如果它不为空则重新使用它。但它不起作用(在另一个 post 中阅读此方法)。
// initializing MP
mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
// Starting MediaProjection
private void startProjection() {
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
}
// OnActivityResult
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
if (requestCode == 100) {
if(mProjectionManager == null) {
cancelEverything();
return;
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if(mProjectionManager != null)
sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
else
cancelEverything();
if (sMediaProjection != null) {
File externalFilesDir = getExternalFilesDir(null);
if (externalFilesDir != null) {
STORE_DIRECTORY = externalFilesDir.getAbsolutePath() + "/screenshots/";
File storeDirectory = new File(STORE_DIRECTORY);
if (!storeDirectory.exists()) {
boolean success = storeDirectory.mkdirs();
if (!success) {
Log.e(TAG, "failed to create file storage directory.");
return;
}
}
} else {
Log.e(TAG, "failed to create file storage directory, getExternalFilesDir is null.");
return;
}
// display metrics
DisplayMetrics metrics = getResources().getDisplayMetrics();
mDensity = metrics.densityDpi;
mDisplay = getWindowManager().getDefaultDisplay();
// create virtual display depending on device width / height
createVirtualDisplay();
// register orientation change callback
mOrientationChangeCallback = new OrientationChangeCallback(getApplicationContext());
if (mOrientationChangeCallback.canDetectOrientation()) {
mOrientationChangeCallback.enable();
}
// register media projection stop callback
sMediaProjection.registerCallback(new MediaProjectionStopCallback(), mHandler);
}
}
}, 2000);
}
}
我的代码在 Android 以下的版本上运行良好 Android 9. 在旧的 android 版本上,我可以选择保留授予录音权限的决定,它永远不会显示再次起来。那么我在 Android 9 中可以做什么?
提前致谢,我很高兴你有每一个想法:)
嗯,问题是我在打电话
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
每次,这不是必需的(createScreenCaptureIntent()
导致对话框 window 请求用户交互)
我的解决方案使对话框只出现一次(如果应用程序关闭,它将再次请求许可)。
我所要做的就是制作 Intent 和 int 类型的附加私有静态变量。
private static Intent staticIntentData;
private static int staticResultCode;
在 Activity 结果上,我将传递的结果代码和意图分配给这些变量:
if(staticResultCode == 0 && staticIntentData == null) {
sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
staticIntentData = data;
staticResultCode = resultCode;
} else {
sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData)};
}
每次调用 startprojection 方法时,我都会检查它们是否为空:
if(staticIntentData == null)
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
else
captureScreen();
如果为 null 它将请求权限,否则它将使用静态意图数据和静态 int resultcode 开始投影,因此不需要再次请求该权限,只需重用您在 [=34 中获得的内容=]结果。
sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData);
就这么简单!现在它只会在您每次使用该应用程序时显示一次。我想这就是 Google 想要的,因为在该对话框中没有像以前的 android 版本那样保留决定复选框。
我制作了一个 OCR 应用程序,它使用 Android mediaprojection 制作屏幕截图并处理该图像中的文本。这工作正常,除了 Android 9+。当 mediaprojeciton 启动时,总是会弹出一个 window 警告,提示可能会记录敏感数据,以及一个取消或开始记录的按钮。我怎样才能实现这个 window 只会显示一次?
我试图通过创建两个额外的私有静态变量来存储 mediaprojection 的意图和结果数据来防止它弹出,如果它不为空则重新使用它。但它不起作用(在另一个 post 中阅读此方法)。
// initializing MP
mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
// Starting MediaProjection
private void startProjection() {
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
}
// OnActivityResult
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
if (requestCode == 100) {
if(mProjectionManager == null) {
cancelEverything();
return;
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if(mProjectionManager != null)
sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
else
cancelEverything();
if (sMediaProjection != null) {
File externalFilesDir = getExternalFilesDir(null);
if (externalFilesDir != null) {
STORE_DIRECTORY = externalFilesDir.getAbsolutePath() + "/screenshots/";
File storeDirectory = new File(STORE_DIRECTORY);
if (!storeDirectory.exists()) {
boolean success = storeDirectory.mkdirs();
if (!success) {
Log.e(TAG, "failed to create file storage directory.");
return;
}
}
} else {
Log.e(TAG, "failed to create file storage directory, getExternalFilesDir is null.");
return;
}
// display metrics
DisplayMetrics metrics = getResources().getDisplayMetrics();
mDensity = metrics.densityDpi;
mDisplay = getWindowManager().getDefaultDisplay();
// create virtual display depending on device width / height
createVirtualDisplay();
// register orientation change callback
mOrientationChangeCallback = new OrientationChangeCallback(getApplicationContext());
if (mOrientationChangeCallback.canDetectOrientation()) {
mOrientationChangeCallback.enable();
}
// register media projection stop callback
sMediaProjection.registerCallback(new MediaProjectionStopCallback(), mHandler);
}
}
}, 2000);
}
}
我的代码在 Android 以下的版本上运行良好 Android 9. 在旧的 android 版本上,我可以选择保留授予录音权限的决定,它永远不会显示再次起来。那么我在 Android 9 中可以做什么?
提前致谢,我很高兴你有每一个想法:)
嗯,问题是我在打电话
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
每次,这不是必需的(createScreenCaptureIntent()
导致对话框 window 请求用户交互)
我的解决方案使对话框只出现一次(如果应用程序关闭,它将再次请求许可)。
我所要做的就是制作 Intent 和 int 类型的附加私有静态变量。
private static Intent staticIntentData;
private static int staticResultCode;
在 Activity 结果上,我将传递的结果代码和意图分配给这些变量:
if(staticResultCode == 0 && staticIntentData == null) {
sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
staticIntentData = data;
staticResultCode = resultCode;
} else {
sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData)};
}
每次调用 startprojection 方法时,我都会检查它们是否为空:
if(staticIntentData == null)
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
else
captureScreen();
如果为 null 它将请求权限,否则它将使用静态意图数据和静态 int resultcode 开始投影,因此不需要再次请求该权限,只需重用您在 [=34 中获得的内容=]结果。
sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData);
就这么简单!现在它只会在您每次使用该应用程序时显示一次。我想这就是 Google 想要的,因为在该对话框中没有像以前的 android 版本那样保留决定复选框。