Я столкнулся с проблемой, когда не могу найти решение прямо сейчас.
Я хочу записать экран устройства.
Когда я нажимаю на значок приложения, он не должен открывать никаких приложений, просто Notification
с одной кнопкой «Пуск / Запись», чтобы начать запись.
При нажатии на эту кнопку должна начаться запись экрана устройства, Notificatio
все равно должен оставаться там.
Вместо кнопки «Пуск / Запись», кнопки «Стоп» и «сообщения / заголовка» уведомления - секунды, прошедшие с момента начала записи.
Код для начала записи и его завершения я уже написал, но есть некоторые проблемы, которые я не могу решить здесь:
1) Когда я нажимаю на значок приложения, должно появиться только уведомление, чтобы решить, начать запись или нет.
Так что мне не нужно использовать setContentView
.
Проблема в том, что когда я нажимаю на значок приложения, начинается действие, даже если оно ничего не содержит setContentView
как будто была патина, на самом деле есть пустая прозрачная активность черного цвета с непрозрачностью 50%, где вы можете видеть под экраном устройства с иконками ниже, но вы не можете сделать какой-либо жест, как нажатие на другое приложение или другие подобные вещи.
Единственный способ - закрыть нужное приложение, вернуться назад или закрыть его.
Для этой проблемы какое решение вы рекомендуете?
Я думал об управлении им как виджетом Android, но я не знаю.
2) Как вы знаете действия NotificationCompat.Builder
, они работают с помощью Intent.
Я должен убедиться, что:
Когда я нажимаю кнопку «Пуск», начинается запись.
Когда я нажимаю кнопку «Стоп», это заканчивается.
Таким образом, для завершения должна быть та же регистрация, но при работе с Intent новый экземпляр запускается отдельно.
Как я могу создать один экземпляр, на который я могу ссылаться и использовать их методы.
Я читал кое-что об использовании услуг, но я не доволен.
Короче говоря, мне нужно создать синглтон для этой вещи.
Используйте onActivityResult
, чтобы запросить разрешение на регистрацию, я делаю что-то вроде этого:
startActivityForResult(mProjectionManager.createScreenCaptureIntent (), CAST_PERMISSION_CODE);
Можете ли вы дать мне руку?
package com.unkinstagram;
import android.content.Context;
import android.content.Intent;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity2 extends AppCompatActivity {
private static final int CAST_PERMISSION_CODE = 22;
private DisplayMetrics mDisplayMetrics;
private MediaProjection mMediaProjection;
private VirtualDisplay mVirtualDisplay;
private MediaRecorder mMediaRecorder;
private MediaProjectionManager mProjectionManager;
private boolean startRec = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mDisplayMetrics = new DisplayMetrics();
mMediaRecorder = new MediaRecorder();
mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
Button start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (!startRec) {
prepareRecording("start");
startRecording();
}
}
});
Button stop = (Button) findViewById(R.id.stop);
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (startRec) stopRecording();
}
});
}
private void startRecording() {
startRec = true;
// If mMediaProjection is null that means we didn't get a context, lets ask the user
if (mMediaProjection == null) {
// This asks for user permissions to capture the screen
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), CAST_PERMISSION_CODE);
return;
}
mVirtualDisplay = getVirtualDisplay();
mMediaRecorder.start();
}
private void stopRecording() {
startRec = false;
if (mMediaRecorder != null) {
mMediaRecorder.stop();
mMediaRecorder.reset();
}
if (mVirtualDisplay != null) {
mVirtualDisplay.release();
}
if (mMediaProjection != null) {
mMediaProjection.stop();
}
}
public String getCurSysDate() {
return new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());
}
private void prepareRecording(String name) {
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
Toast.makeText(this, "Failed to get External Storage", Toast.LENGTH_SHORT).show();
return;
}
final String directory = Environment.getExternalStorageDirectory() + File.separator + "Recordings";
final File folder = new File(directory);
boolean success = true;
if (!folder.exists()) {
success = folder.mkdir();
}
if (!success) {
Toast.makeText(this, "Failed to create Recordings directory", Toast.LENGTH_SHORT).show();
return;
}
String videoName = (name + "_" + getCurSysDate() + ".mp4");
String filePath = directory + File.separator + videoName;
int width = mDisplayMetrics.widthPixels;
int height = mDisplayMetrics.heightPixels;
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setVideoEncodingBitRate(8000 * 1000);
mMediaRecorder.setVideoFrameRate(24);
mMediaRecorder.setVideoSize(width, height);
mMediaRecorder.setOutputFile(filePath);
try {
mMediaRecorder.prepare();
} catch (Exception e) {
e.printStackTrace();
return;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != CAST_PERMISSION_CODE) {
// Where did we get this request from ? -_-
Log.w("class:", "Unknown request code: " + requestCode);
return;
}
if (resultCode != RESULT_OK) {
Toast.makeText(this, "Screen Cast Permission Denied :(", Toast.LENGTH_SHORT).show();
return;
}
mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
// TODO Register a callback that will listen onStop and release & prepare the recorder for next recording
// mMediaProjection.registerCallback(callback, null);
mVirtualDisplay = getVirtualDisplay();
mMediaRecorder.start();
}
private VirtualDisplay getVirtualDisplay() {
int screenDensity = mDisplayMetrics.densityDpi;
int width = mDisplayMetrics.widthPixels;
int height = mDisplayMetrics.heightPixels;
return mMediaProjection.createVirtualDisplay(this.getClass().getSimpleName(),
width, height, screenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/);
}
}