相关疑难解决方法(0)

如何以编程方式截取屏幕截图?

如何通过任何程序而不是代码来截取手机屏幕的选定区域?

android screenshot

483
推荐指数
19
解决办法
31万
查看次数

除了要求许可外,如何在不干扰当前前台进程的情况下获取媒体投影管理器?

问题:我有一个屏幕截图应用程序,它使用浮动覆盖服务进行控制,并使用屏幕转换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 android-5.0-lollipop

15
推荐指数
1
解决办法
1万
查看次数

如何在全球范围内正确截取屏幕截图?

背景

从Android API 21开始,应用程序可以全局截取屏幕并记录屏幕.

问题

我已经在互联网上发现了一些示例代码,但它有一些问题:

  1. 这很慢.也许有可能避免它,至少对于多个​​屏幕截图,避免通知它被删除直到真的不需要.
  2. 它左右有黑色边距,这意味着计算可能出错:

在此输入图像描述

我试过的

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)

android screenshot android-mediaprojection

15
推荐指数
1
解决办法
2846
查看次数

服务中的Android MediaProjectionManager

我想构建一个应用程序,我必须在服务中使用MediaProjectionManager.但我无法解决它,因为'startActivityForResult'不能在Service类中使用.

service android broadcastreceiver android-mediaprojection

8
推荐指数
1
解决办法
7075
查看次数

如何创建一个可以点击其他应用程序的自动点击器应用程序?

我见过很多提供自动点击功能的应用程序。但是他们不提供一些特定的定制,所以我决定创建一个。我看过很多提供自动点击的教程,但它们应该在同一个应用程序中使用。但我想创建一个可以点击其他应用程序视图的自动点击应用程序。我是一名中级 Java 开发人员,但对 Android Studio 不熟悉,所以我对 Android API 了解不多。是否有任何类或包可以提供此功能。为了获得更多许可,我想做自动点击,当屏幕上特定位置的颜色(例如 (213, 120) 变为绿色时)。提前致谢!

android ui-automation android-studio-3.0

7
推荐指数
1
解决办法
7868
查看次数

使用媒体投影 API 在设备之间共享屏幕

我正在开发一个具有与其他应用程序共享屏幕功能的应用程序。

我为此使用了媒体投影 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

6
推荐指数
1
解决办法
2134
查看次数

将RAW字节数据转换为位图

我正在使用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 *,但它仍然带有蓝色调。

我为现在可以做的事情以正确的颜色使图像动摇不已。我假设它读取的是红色的蓝色和蓝色的红色,反之亦然。

我以为我可以操纵原始字节数据,以便在将其转换为位图时按正确的字节顺序进行操作,但是我不确定该如何去做。

有什么建议么?

c# android bitmap image-processing

1
推荐指数
1
解决办法
7006
查看次数