jjzjj

android - Nexus 10,前置摄像头预览为黑色(无预览)

coder 2023-11-25 原文

所以我正在从事与相机相关的项目,我已经在许多设备上对其进行了测试,除 Nexus 10 外,所有设备都通过了测试。

我真的搞不懂这是怎么回事,网上也没有人讨论这个问题。

我能够在两个不同的 Nexus 10 (wifi) 设备上重现该问题。

这是我的 Activity 代码:

public class MainActivity extends Activity {
    private static Camera mCamera;
    private static boolean mCameraOpen;
    private static ImageView mPreviewImageView;
    private SurfaceView mPreviewSurfaceView;
    private static boolean mPreviewRunning;
    private static Handler mHandler;
    private static int TESTS_COUNT = 0;
    private Camera.Parameters mCameraParameters;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mHandler = new Handler();
        mPreviewSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        mPreviewImageView = (ImageView) findViewById(R.id.imageview);
        mPreviewSurfaceView.getHolder().addCallback(mCallback);

        TextView view = (TextView) findViewById(R.id.textview);
        view.setText("Format: " + String.valueOf(TESTS_COUNT));

    }

    @Override
    public void onResume(){
        super.onResume();
        if (mCamera == null){
            for (int i = 0; i < Camera.getNumberOfCameras(); i++){
                Camera.CameraInfo info = new Camera.CameraInfo();
                Camera.getCameraInfo(i, info);

                if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
                    mCamera = Camera.open(i);
                    Camera.Parameters params = mCamera.getParameters();
                    params.set("camera-id", 2);
                    List<Integer> formats = params.getSupportedPreviewFormats();
                    if (formats.size() > TESTS_COUNT) {
                        Log.e("Camera", "testing preview format at index: " + TESTS_COUNT);
                        params.setPreviewFormat(formats.get(TESTS_COUNT));
                        mCamera.setParameters(params);
                        mCameraOpen = true;
                        SurfaceHolder holder = mPreviewSurfaceView.getHolder();
                        if (holder != null && holder.getSurface() != null && holder.getSurface().isValid()) {
                            mCallback.surfaceCreated(holder);
                        }
                        mCameraParameters = params;
                        break;
                    } else {
                        finish();
                    }
                }

            }
        }
    }

    @Override
    public void onPause(){
        super.onPause();
        if (mPreviewRunning){
            mCamera.stopPreview();
            mCamera.setPreviewCallback(null);
            mPreviewRunning = false;
        }

        if (mCameraOpen){
            mCamera.release();
            mCamera = null;
            mCameraOpen = false;
        }
    }

    @Override
    public void onDestroy(){
        super.onDestroy();

    }

    private final SurfaceHolder.Callback mCallback =  new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
                if (mCameraOpen && mCamera != null){
                    try {
                        mCamera.setPreviewDisplay(surfaceHolder);
                        mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                            private int count;
                            private int total;
                            @Override
                            public void onPreviewFrame(byte[] bytes, Camera camera) {
                                if (count == 15){
                                    Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
                                    // pWidth and pHeight define the size of the preview Frame
                                    ByteArrayOutputStream out = new ByteArrayOutputStream();

                                    // Alter the second parameter of this to the actual format you are receiving
                                    YuvImage yuv = new YuvImage(bytes, ImageFormat.NV21, previewSize.width, previewSize.height, null);

                                    // bWidth and bHeight define the size of the bitmap you wish the fill with the preview image
                                    yuv.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 50, out);
                                    byte[] bitmapBytes = out.toByteArray();
                                    final Bitmap bitmap= BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
                                    mHandler.post(new Runnable() {
                                        @Override
                                        public void run() {
                                            mPreviewImageView.setImageBitmap(bitmap);
                                        }
                                    });
                                    count = 0;
                                    total++;
                                    if (total > 5){
                                        TESTS_COUNT++;
                                        if (TESTS_COUNT == mCameraParameters.getSupportedPreviewSizes().size()) {
                                            finish();
                                            return;
                                        }
                                        Intent intent = new Intent( MainActivity.this, MainActivity.class);
                                        startActivity(intent);

                                    }

                                } else {
                                    count++;
                                }

                            }
                        });

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        }

        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder,  int format, int width, int height) {
            for (Camera.Size size : mCameraParameters.getSupportedPreviewSizes()){
                if (size.width == width && size.height == height){
                    if (mCameraOpen && mCamera != null && mPreviewRunning == false) {
                        mCameraParameters.setPreviewSize(width, height);
                        mCamera.setParameters(mCameraParameters);

                        mCamera.startPreview();

                        mPreviewRunning = true;
                        break;
                    }
                }
            }
            if (mPreviewRunning == false){
                Log.e("CameraPreview", "size not supported");
            }

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

        }
    };

}

我的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context=".MainActivity"
    android:orientation="vertical"
    android:weightSum="2">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello"/>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context=".MainActivity"
    android:orientation="horizontal"
    android:layout_weight="1"
    android:weightSum="2">
        <SurfaceView
            android:layout_width="640px"
            android:layout_height="480px"
            android:id="@+id/surfaceview"/>
        <ImageView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/imageview"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textview"
            android:textSize="40sp"/>
</LinearLayout>
</LinearLayout>

和 list :

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

没有错误信息,只是黑屏

最佳答案

根本的问题是,“如何调试它?”一如既往,答案是尽可能多地考虑可以解释这些结果的假设,然后检验这些假设。 p>

这里有一些假设(多想想):

  • 它没有找到任何摄像头。
  • 它没有找到任何前置摄像头。
  • 它误解了相机参数。
  • 设置 mCallback 太晚了,也就是说,在需要之后。
  • 它没有找到有效的表面。
  • 它没有成功注册相机帧。
  • 它正在注册但没有接收到任何相机帧。
  • 它正在接收相机帧但无法显示它们,例如图像不是预期的格式,或者 setImageBitmap(bitmap) Runnable 未运行。
  • TESTS_COUNT 没有按照您的意愿进行。

您可以通过日志记录来检验假设,但对于大部分情况,在调试器中单步执行它并检查数据值(如 params)会更快、提供更多信息。

如果您不熟悉调试器,现在是时候了!

关于android - Nexus 10,前置摄像头预览为黑色(无预览),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32509333/

有关android - Nexus 10,前置摄像头预览为黑色(无预览)的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  3. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  4. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  5. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

  6. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

  7. ruby-on-rails - 在 osx 10.9.3 上使用 RVM 安装 ruby​​-1.9.3-p547 时出错 - 2

    如何解决这个错误:$rvminstall1.9.3Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.9/x86_64/ruby-1.9.3-p547.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Checkingrequirementsforosx.Certificatesin'/usr/local/etc/openssl/cert.pem'arealr

  8. u盘安装系统(win10为例) - 2

    下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,

  9. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  10. ruby-on-rails - OSX 10.7.5 - Ruby on Rails LoadError : Could not open library 'sodium' : dlopen(sodium, 5) - 2

    输入rakedb:create后我得到:LoadError:Couldnotopenlibrary'sodium':dlopen(sodium,5):imagenotfound.Couldnotopenlibrary'libsodium.dylib':dlopen(libsodium.dylib,5):imagenotfound这里还有一些输出。/Users/Mao/.rvm/gems/ruby-2.0.0-p451/gems/ffi-1.9.3/lib/ffi/library.rb:133:in`blockinffi_lib'/Users/Mao/.rvm/gems/ruby-2.0

随机推荐