必威体育Betway必威体育官网
当前位置:首页 > IT技术

关于SurfaceHolder.addCallback方法无法调用surfaceCreated 方法不回调的一个建议

时间:2019-08-27 18:41:06来源:IT技术作者:seo实验室小编阅读:59次「手机版」
 

surfacecreated

我遇到这个问题的场景是:页面一个大的surfaceview .想要通过相机实时预览捕获到的场景。页面进入的时候动态获取相机权限,如果有权限则直接绑定holder 

surfaceholder=surfaceView.getHolder();

surfaceHolder.addCallback(MainActivity.this);

如果没有则申请。。在异步回调成功方法里,执行上面绑定:结果:

每次运行APP.第一次给权限以后总是黑屏。不走surfaceCreated 方法。重启APP就好了。。查询了好多资料。。

终于在文章:https://bbs.csdn.net/topics/392055168?page=1#post-403322796

中发现了同病相怜的人。

最后他给的建议是:说法了就是 绑定Holder时机不对!!!

因为SurfaceView写在xml文件中,界面显示以后其实已经创建了,但是这时候没有添加生命周期的回调,所以后来添加了,这个接口也不会调用了。所以解决办法是。。初始化时候就直接绑定holder在 surfaceCreated里面去查看权限。。如果有则正常处理。否则 申请。。申请回调 成功 也去初始化相机。并打开关联。问题解决。

我的页面代码如下:

package com.example.sunlei.mysurface;

import Android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Pixelformat;
import android.hardware.Camera;
import android.os.handler;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.contextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.TextView;
import android.widget.toast;

import java.io.IOException;

public class MainActivity extends Activity implements SurfaceHolder.Callback{
    private String TAG="result";
    SurfaceView surfaceView;
    Camera camera;
    SurfaceHolder surfaceHolder;
    @Override
    protected void onCreate(Bundle savedinstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        surfaceView=findViewById(R.id.surface);
        inicSurfaceHolder();//第二处
    }
    /***
     * 初始SurfaceHolder
     */
    private void inicSurfaceHolder(){
        surfaceHolder=surfaceView.getHolder();

        surfaceHolder.addCallback(MainActivity.this);
        surfaceView.setVisibility(View.VISIBLE);
        Log.d(TAG,"inicCamera");
    }
    /**
     * 相机预览
     * @param holder
    */
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG,"surfaceCreated");
        requestpermission();
    }
    void initCamera(){
        try {
            camera= android.hardware.Camera.open();
            camera.setPreviewdisplay(surfaceHolder);
        } catch (IOException e) {
            e.printstacktrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onresume");
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Log.d(TAG,"surfaceChanged");
        if(camera!=null){
            camera.startPreview();
        }
    }
    @Override
    public void surfacedestroyed(SurfaceHolder holder) {
        if(camera!=null){
            camera.stopPreview();
            camera.release();
            camera=null;
        }
    }
    /***
     * 申请权限
     */
    void RequestPermission(){
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1);
            Log.d(TAG,"RequestPermission");
        }else{
           initCamera();
        }
    }
    /**
     * 权限回调
     * @param requestcode
    * @param permissions
    * @param grantResults
    */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.d(TAG,"onRequestPermissionsResult");
        if(requestCode==1){
            if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                initCamera();
                if(camera!=null){
                    camera.startPreview();
                }

            }else{
                toast.maketext(MainActivity.this,"授权失败",Toast.LENGTH_LONG).show();;
            }
        }
    }
}
问题解决。

相关阅读

免费下载中国知网、万方学术论文的几种方法(福利合集)

在国内,中国知网收录了最多的期刊论文和硕博士论文。无论学霸学渣,都得上去下载论文。如果你的学校在知网购买了相应的下载版权,那恭

京东商城首页网址被劫持?5种方法解决京东网址跳转

不知道大家使用京东购物时有没有注意过自己的京东网址是否正常?小编前几天双十一的时候受一个好友的委托,在京东帮他买一件东西,当

2017网上赚钱最快的方法 适合年轻大众的热门项目

现在可能大家尤其是对于成年人来说,或者是步入这个社会多年的人,或者是说在社会中身上背负一定的经济压力的人来说,大家都有一个很关

QQ空间动态不显示(被屏蔽)的解决方法

经常在QQ空间发说说或者是日志的朋友,一定会遇到动态不显示的情况,就是发了说说或者日志,自己能看到,但不展示给好友,别人看不到。根据

autojs调用java的类库爬取bilibili视频弹幕内容,get请

/** * @功能 爬取指定bilibili视频弹幕 * @作者 家 * @感谢 内个谁, ProjectXero * @难点 不会解压gzip和deflate,再次感谢上

分享到:

栏目导航

推荐阅读

热门阅读