问题:我有一个屏幕截图应用程序,它使用浮动覆盖服务进行控制,并使用屏幕转换API媒体项目管理器来访问屏幕.有时当设备内存不足时,Android重新启动服务,我丢失了媒体投影.
我知道重新获取新媒体投影的唯一方法是重新打开请求权限的活动,这将是它的结束,除了一个问题.某些应用程序,特别是游戏,似乎在丢失前台进程,暂停或以其他方式重置时进行侦听.这很烦人.
这是我理想的场景.服务打开,如果用户在权限请求对话框中选择了"已检查不再询问我",则会以不干扰当前前台活动的方式获取媒体投影.
如何在不干扰当前前台进程的情况下获得媒体投影管理器?
是否有办法从直接服务获取媒体投影,或者从服务中在后台打开活动?
目前我在Activity中使用此代码来获取媒体投影管理器
@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();
}
}
}
Run Code Online (Sandbox Code Playgroud) 从Android API 21开始,应用程序可以全局截取屏幕并记录屏幕.
我已经在互联网上发现了一些示例代码,但它有一些问题:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_ID = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.checkIfPossibleToRecordButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
ScreenshotManager.INSTANCE.requestScreenshotPermission(MainActivity.this, REQUEST_ID);
}
});
findViewById(R.id.takeScreenshotButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
ScreenshotManager.INSTANCE.takeScreenshot(MainActivity.this);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ID)
ScreenshotManager.INSTANCE.onActivityResult(resultCode, data);
}
}
Run Code Online (Sandbox Code Playgroud)
布局/ activity_main.xml中
<LinearLayout …Run Code Online (Sandbox Code Playgroud) 我想构建一个应用程序,我必须在服务中使用MediaProjectionManager.但我无法解决它,因为'startActivityForResult'不能在Service类中使用.
我见过很多提供自动点击功能的应用程序。但是他们不提供一些特定的定制,所以我决定创建一个。我看过很多提供自动点击的教程,但它们应该在同一个应用程序中使用。但我想创建一个可以点击其他应用程序视图的自动点击应用程序。我是一名中级 Java 开发人员,但对 Android Studio 不熟悉,所以我对 Android API 了解不多。是否有任何类或包可以提供此功能。为了获得更多许可,我想做自动点击,当屏幕上特定位置的颜色(例如 (213, 120) 变为绿色时)。提前致谢!
我正在开发一个具有与其他应用程序共享屏幕功能的应用程序。
我为此使用了媒体投影 API。我还使用 MediaMuxer 组合音频和视频输出以进行屏幕共享。
我知道媒体投影 API 用于屏幕录制,但我只想在录制时共享屏幕。
为此,我修改了 MediaMuxer 类的 writeSampleData 方法,以通过套接字将字节发送到网络上的其他设备。
下面是代码:
OutputStream outStream;
Run Code Online (Sandbox Code Playgroud)
outStream = ScreenRecordingActivity.getInstance().socket.getOutputStream();
void writeSampleData(final int trackIndex, final ByteBuffer byteBuf, final MediaCodec.BufferInfo bufferInfo) {
if (mStatredCount > 0) {
mMediaMuxer.writeSampleData(trackIndex, byteBuf, bufferInfo);
if (bufferInfo.size != 0) {
byteBuf.position(bufferInfo.offset);
byteBuf.limit(bufferInfo.offset + bufferInfo.size);
if (outStream != null) {
try {
byte[] bytes = new byte[byteBuf.remaining()];
byteBuf.get(bytes);
//Send the data
outStream.write(bytes);
outStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
字节通过套接字成功传输,我也能够在接收器端接收这些字节。
下面是接收端接收字节的代码:
private class …Run Code Online (Sandbox Code Playgroud) android mediamuxer android-mediaprojection android-mediacodec
我正在使用ADB截取android设备的屏幕截图,并将屏幕截图作为原始字节数据接收。
我知道通过的原始字节数据的格式为rgba
红色为偏移量0,绿色为偏移量8,蓝色为偏移量16,Alpha偏移量为24,每个值为1个字节。这构成了整个字节数组。
我正在尝试将此字节数组转换为C#中的位图,并且在大多数情况下都可以正常工作,除了看起来带有“蓝色调”的事实外,图像在各个方面看起来都是正确的-着色已关闭。
以下是我用来转换原始字节数据的代码:
int WriteBitmapFile(string filename, int width, int height, byte[] imageData)
{
using (var stream = new MemoryStream(imageData))
using (var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb))
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
bmp.Width,
bmp.Height),
ImageLockMode.WriteOnly,
bmp.PixelFormat);
IntPtr pNative = bmpData.Scan0;
Marshal.Copy(imageData, 0, pNative, imageData.Length);
bmp.UnlockBits(bmpData);
bmp.Save(filename);
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我在这篇文章中读到,这可能与实际rgba值的字节顺序有关。如您在上面的代码中看到的,我尝试将bmpData.Scan0强制转换为int *,但它仍然带有蓝色调。
我为现在可以做的事情以正确的颜色使图像动摇不已。我假设它读取的是红色的蓝色和蓝色的红色,反之亦然。
我以为我可以操纵原始字节数据,以便在将其转换为位图时按正确的字节顺序进行操作,但是我不确定该如何去做。
有什么建议么?