我试图通过代码获取我的游戏截图并通过意图分享.我可以做这些事情,但屏幕截图总是显示为黑色.以下是与共享屏幕截图相关的代码:
View view = MainActivity.getView();
view.setDrawingCacheEnabled(true);
Bitmap screen = Bitmap.createBitmap(view.getDrawingCache(true));
.. save Bitmap
Run Code Online (Sandbox Code Playgroud)
这是在MainActivity中:
view = new GameView(this);
view.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.FILL_PARENT,
RelativeLayout.LayoutParams.FILL_PARENT));
public static SurfaceView getView() {
return view;
}
Run Code Online (Sandbox Code Playgroud)
而观点本身:
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
private static SurfaceHolder surfaceHolder;
...etc
Run Code Online (Sandbox Code Playgroud)
这就是我绘制一切的方式:
Canvas canvas = surfaceHolder.lockCanvas(null);
if (canvas != null) {
Game.draw(canvas);
...
Run Code Online (Sandbox Code Playgroud)
好的,根据一些答案,我构建了这个:
public static void share() {
Bitmap screen = GameView.SavePixels(0, 0, Screen.width, Screen.height);
Calendar c = Calendar.getInstance();
Date d = c.getTime();
String path = …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要捕获屏幕到位图进行传输的应用程序.我正在尝试使用新的Android 5.0 android.media.projection API来进行屏幕捕获.
此API的工作流程最终会调用
mediaProjection.createVirtualDisplay("Test Screen", WIDTH, HEIGHT, DPI,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null);
Run Code Online (Sandbox Code Playgroud)
在我最初尝试捕获时,我从SurfaceView中获取了表面对象.这工作正常; 最终结果是在屏幕上绘制的显示器的微小副本(导致Droste效果)
我认为这个功能几近完成,但我发现 SurfaceViews(从代码的角度来看)是不可读的; 你不能从他们那里得到一个位图.
在寻找其他解决方案时,我遇到了这个与我的目标非常相似的问题,并且在该线程中建议使用ImageReader而不是SurfaceView来获取传递给createVirtualDisplay API调用的Surface.
但是,当我更改我的代码以使用ImageReader代替SurfaceView时,我得到运行时logcat错误(没有异常),并且永远不会调用ImageReader的回调函数.createVirtualDisplay调用还返回一个看似有效的VirtualDisplay对象.
这是logcat:
9230-9270/com.android.techrocket9.nanoid E/BufferQueueProducer? [unnamed-9230-0] dequeueBuffer: createGraphicBuffer failed
9230-9246/com.android.techrocket9.nanoid E/BufferQueueProducer? [unnamed-9230-0] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
9230-9246/com.android.techrocket9.nanoid E/BufferQueueProducer? [unnamed-9230-0] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
9230-9246/com.android.techrocket9.nanoid E/BufferQueueProducer? [unnamed-9230-0] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
9230-9246/com.android.techrocket9.nanoid E/BufferQueueProducer? …Run Code Online (Sandbox Code Playgroud) 我尝试从下面的链接测试关于屏幕记录的示例代码,我修改了一些代码以禁用录制音频.
http://www.truiton.com/2015/05/capture-record-android-screen-using-mediaprojection-apis/
我在Android Studio V1.3中测试代码,但是我收到以下错误,文件capture.mp4为空.
我不确定我是否必须在真正的手机上测试代码?你可以帮帮我吗 ?谢谢!
错误信息
09-22 06:41:50.250 2167-2167/? E/AndroidRuntime? FATAL EXCEPTION: main
Process: screencapture.truiton.com.myapplication, PID: 2167
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.stop(Native Method)
at screencapture.truiton.com.myapplication.MainActivity.onToggleScreenShare(MainActivity.java:93)
at screencapture.truiton.com.myapplication.MainActivity$1.onClick(MainActivity.java:55)
at android.view.View.performClick(View.java:4780)
at android.widget.CompoundButton.performClick(CompoundButton.java:120)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Run Code Online (Sandbox Code Playgroud)
源代码
package screencapture.truiton.com.myapplication;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private static final int PERMISSION_CODE = 1;
private int mScreenDensity;
private MediaProjectionManager …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一种功能,包括录制视频时拍摄照片.这就是我结束使用SurfaceView的截图方法的原因.
但是,当我尝试使用SurfaceView的屏幕截图时.我总是得到一张空白图片.
这是我用于拍摄快照的代码:
View tempView = (View)MY_SURFACE_VIEW;
tempView.setDrawingCacheEnabled(true);
Bitmap tempBmp = Bitmap.createBitmap(tempView.getDrawingCache());
tempView.setDrawingCacheEnabled(false);
//Saving this Bitmap to a File....
Run Code Online (Sandbox Code Playgroud)
如果您认为这是一个重复的问题,请允许我向您保证,在询问此问题之前,我已经尝试过针对相同问题在SO上提供的以下解决方案.
互联网上的其他资源:
1.http ://www.coderanch.com/t/622613/Android/Mobile/capture-screenshot-simple-animation-project
2. http://www.phonesdevelopers.com/1795894/
到目前为止,这对我来说都没有.我也知道我们需要创建一些与Surface Holder交互并从中获取位图的Thread.但我不知道如何实现这一点.
任何帮助都得到高度赞赏.