首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android SurfaceView IllegalArgumentException lockCanvas

Android SurfaceView IllegalArgumentException lockCanvas
EN

Stack Overflow用户
提问于 2015-12-16 09:19:30
回答 2查看 1.2K关注 0票数 1

我正在制作一段SurfaceView视频。我的目标是获得运行视频的反复位图。以下是我的自定义实现:

代码语言:javascript
运行
复制
private static final String TAG = "XXX";
private Activity activity;
private SurfaceHolder mSurface;
private MediaPlayer mMediaPlayer;
private SurfaceHolder mActiveSurface;
public ImageView imageView;

boolean locked, locked1;
private boolean isCreated;


public AlphaSurfaceView(Context context,Activity activity) {
    super(context);
    getHolder().addCallback(this);
    setWillNotDraw(false);
    this.activity = activity;
}

public AlphaSurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);

}

public AlphaSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
}

@Override
public void onDraw(Canvas canvas) {
    //super.onDraw(canvas);
    if(isCreated){
        if(getHolder() != null && getHolder().getSurface().isValid()){
            Canvas c = null;
            try {
                if(!locked){
                    try {
                        c = getHolder().lockCanvas();
                        locked = true;
                    }catch (IllegalArgumentException e){
                        e.printStackTrace();
                        locked = false;
                    }
                    BitmapDrawable bdrawable = new BitmapDrawable();
                    bdrawable.draw(c);
                }

            }catch (Exception e){
                e.printStackTrace();
                locked = false;
            }finally {
                if(c != null && locked){
                    getHolder().unlockCanvasAndPost(c);
                    locked = false;
                }
            }
        }
    }else{
        super.onDraw(canvas);
    }
    invalidate();

}



@Override
public void surfaceCreated(SurfaceHolder holder) {
    mSurface = holder;
    mMediaPlayer = MediaPlayer.create(getContext(), Uri.parse("XX"), mSurface);
    mActiveSurface = mSurface;
    try {
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mMediaPlayer.start();
                mMediaPlayer.setLooping(true);
            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
    this.isCreated = true;

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    Log.d(TAG, "surfacechanged");

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mMediaPlayer.stop();
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    mMediaPlayer.stop();
}

该问题是由IllegalArgumentException ()方法引起的。

我尝试了许多可能性,比如:

  • 添加一些布尔值(锁定和创建曲面视图)
  • 检验表面是否有效
  • 甚至在Manifest的xml中的目标活动中添加exported="true“

顺便说一下,第一个想法是使用getDrawingCache(),但即使我添加了setCacheEnabled(true),返回也是空的。

那么,如何解决此异常,还是使用另一种方法获取每个帧?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-12-16 17:45:39

你不能在一个表面上画和发送一个视频到它。曲面是生产者-消费者对的生产者端,一次只能有一个生产者。

SurfaceView曲面重叠画布的最简单方法是在SurfaceView的视图部分进行绘制。将视频发送到Surface,并使用onDraw() (如自定义视图)在视图上进行绘图。

请记住,Surface是位于View层后面的一个单独的层,因此您需要使用透明的View来查看Surface内容。

另一种方法是使用多个重叠的SurfaceViews,但这样做的效率较低,限制也更大。在格拉菲卡多面测试活动中可以找到一个具有三个重叠曲面的例子.

票数 0
EN

Stack Overflow用户

发布于 2016-01-19 17:09:50

代码语言:javascript
运行
复制
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            Log.e("video","surfaceChanged");
        }
        @Override
        public void surfaceCreated(SurfaceHolder arg0) {
            Log.e("video","surfaceCreated");
            mediaPlayer.setDisplay(surfaceHolder);
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder arg0) {
            Log.e("video","surfaceDestroyed");
            if (mediaPlayer != null) mediaPlayer.release();
        }
    });

那会有帮助的。让MediaPlayer来完成绘图工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34308060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档