如何解决当我的应用程序处于后台时,是否可以使用媒体记录器服务并记录我的屏幕?
当我的应用程序处于后台时,我正在尝试从我的手机中截取屏幕截图。使用服务。
我在我的服务 onCreate 中使用它在屏幕上设置了一个按钮。
manager3 = ((WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams params3 = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);
dialogView3 = View.inflate(getBaseContext(),R.layout.dialog_screenshoot3_full,null);
iv_photo1 = dialogView3.findViewById(R.id.iv_photo1);
iv_photo1.setonClickListener(v -> {
if(staticResultCode == 0 && staticIntentData == null){
Intent dialogIntent = new Intent(Service_screen_shot.this,ScreenShotActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
} else {
toogleScreenShare();
}
});
params3.gravity = Gravity.TOP | Gravity.END;
params3.x = 5; //x position
params3.y = 165; //y position
assert manager3 != null;
manager3.addView(dialogView3,params3);
bronActivityResult = new broadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
Toast.makeText(context,"HELLO",Toast.LENGTH_SHORT).show();
staticIntentData = intent.getParcelableExtra("data");
staticResultCode = -1;
toogleScreenShare();
//Toast.makeText(context,"staticIntentData: " + staticIntentData,Toast.LENGTH_SHORT).show();
}
};
IntentFilter brintent = new IntentFilter();
brintent.addAction("brActionFloatingServiceOnActivityResult");
getApplicationContext().registerReceiver(bronActivityResult,brintent);
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
final displayMetrics displayMetrics = new displayMetrics();
wm.getDefaultdisplay().getMetrics(displayMetrics);
mScreenDensity = displayMetrics.densityDpi;
disPLAY_HEIGHT = displayMetrics.heightPixels;
disPLAY_WIDTH = displayMetrics.widthPixels;
接下来是我的 mediarecorder 代码
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void toogleScreenShare() {
initRecorder();
recordScreen();
}
private void initRecorder() {
try {
CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
screenShotUri = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + new StringBuilder("/screenshot").append(".mp4").toString();
mediaRecorder.setoutputFile(screenShotUri);
mediaRecorder.setVideoSize(disPLAY_WIDTH,disPLAY_HEIGHT);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoEncodingBitRate(cpHigh.videoBitRate);
mediaRecorder.setVideoFrameRate(cpHigh.videoFrameRate);
int rotation = wm.getDefaultdisplay().getRotation();
int orientation = ORIENTATION.get(rotation + 90);
mediaRecorder.setorientationHint(orientation);
mediaRecorder.prepare();
} catch (IOException e) {
e.printstacktrace();
Log.d("ExceptionOccured","" + e.getMessage());
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void recordScreen() {
//Toast.makeText(this,"Class recordScreen: ",Toast.LENGTH_SHORT).show();
mediaprojectionmanager = (mediaprojectionmanager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
mediaProjection = mediaprojectionmanager.getMediaProjection(staticResultCode,staticIntentData);
if (mediaProjection != null) {
//virtualdisplay = createVirtualdisplay();
mediaRecorder.start();
//onBackpressed();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mediaRecorder.stop();
mediaRecorder.reset();
//stopRecordScreen();
//destroyMediaProjection();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getPathScreenShot(screenShotUri);
}
},1000);
}
},5000);
}
}
public void getPathScreenShot(String filePath) {
MediaMetadataRetriever med = new MediaMetadataRetriever();
med.setDataSource(filePath);
Bitmap bmp = med.getFrameAtTime(2 * 1000000,MediaMetadataRetriever.OPTION_CLOSEST);
String myPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + new StringBuilder("/screenshot694").append(".jpeg").toString();
File myDir = new File(myPath);
myDir.mkdirs();
if (myDir.exists())
myDir.delete();
try {
FileOutputStream out = new FileOutputStream(myDir);
bmp.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
} catch (Exception e) {
e.printstacktrace();
}
Toast.makeText(this,"PHOTO PATH: " + myPath,Toast.LENGTH_SHORT).show();
}
服务好,按钮好,我可以去活动接受第一次录屏的权限。 我发回数据和 resultCode 来初始化媒体投影。 但是 mediarecorder 没有启动。
我收到此错误
04-05 15:10:51.815:E/MediaRecorder(15709):停止失败:-1007
有什么解决办法吗?? Activity 中的相同代码完美运行。但是任何时候我想要拍照都会出现在活动中,而且我无法在我的应用程序之外拍照。 // 尝试不使用布局,也使用透明主题,但它显示了我只启动我的应用程序和服务的主要活动。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。