gpt4 book ai didi

android - Android 9+ 上的媒体投影问题

转载 作者:行者123 更新时间:2023-12-02 16:37:42 26 4
gpt4 key购买 nike

我制作了一个 OCR 应用程序,它使用 Android mediaprojection 制作屏幕截图并处理该图像中的文本。除 Android 9+ 外,此功能运行良好。当媒体投影启动时,总​​会弹出一个窗口,警告可能记录的敏感数据,以及取消或开始记录的按钮。我怎样才能实现这个窗口只显示一次?

我尝试通过创建两个额外的私有(private)静态变量来存储媒体投影的 Intent 和结果数据来防止它弹出,并在其不为空时重用它。但它不起作用(在另一篇文章中了解此方法)。

popup window

// 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 9 以下的 Android 版本上运行良好。在较旧的 Android 版本上,我可以选择保留授予录制权限的决定,并且它永远不会再出现。那么我可以在 Android 9 中做什么?

提前致谢,我很高兴您的每一个想法:)

最佳答案

问题是我正在打电话startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);每次,这是不必要的(createScreenCaptureIntent() 导致请求用户交互的对话框窗口)我的解决方案使对话框仅出现一次(如果应用程序关闭,它将再次请求许可)。我所要做的就是创建 Intent 和 int 类型的附加私有(private)静态变量。

私有(private)静态 Intent staticIntentData;
私有(private)静态 int staticResultCode;

在 Activity 结果上,我使用传递的结果代码和 Intent 分配这些变量:

if(staticResultCode == 0 && staticIntentData == null) {
sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
staticIntentData = data;
staticResultCode = resultCode;
} else {
sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData)};
}

每次调用 startprojection 方法时,我都会检查它们是否为 null:

if(staticIntentData == null)
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
别的
captureScreen();

如果为null,它将请求权限,如果不是,它将使用静态 Intent 数据和静态int结果代码启动投影,因此不需要再次请求该权限,只需重用您在 Activity 结果中获得的内容即可。

sMediaProjection = mProjectionManager.getMediaProjection(staticResultCode, staticIntentData);

就这么简单!现在,每次您使用该应用程序时,它只会显示一次。我想这就是 Google 想要的,因为该对话框中没有像以前的 Android 版本那样保留决策复选框。

关于android - Android 9+ 上的媒体投影问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56944645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com