无法获取相机preVIEW(通话摄像头),HTC霹雳 [英] Cannot get camera preview (call camera) , HTC Thunderbolt

查看:145
本文介绍了无法获取相机preVIEW(通话摄像头),HTC霹雳的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新的Andr​​oid应用程序开发,所以请任何答案将是巨大的与code的例子。

我的问题是这样的,我必须开发一个相机应用,流MJPEG到服务器。

现在我已经成功创建了应用程序为我的摩托罗拉Atrix和伟大工程。我的问题是在我签字,并出口该应用程序并将其安装在一个HTC霹雳额外的设备测试,我发现它冻结当我试图呼吁摄像机和应用程序崩溃。

从那时起我就想尽例子/样本code相机preVIEW在网络上,并在这些论坛特别,我不断地得到相同的结果。我把它在我的Atrix但不是在霹雳工作。

在应用程序上运行霹雳我得到这样的:

  16 07-01:11:12.643:D / AndroidRuntime(1140):关闭VM
07-01 16:11:12.643:W / dalvikvm(1140):主题ID = 1:螺纹未捕获的异常(组= 0x40015560)退出
07-01 16:11:12.653:E / AndroidRuntime(1140):致命异常:主要
07-01 16:11:12.653:E / AndroidRuntime(1140):了java.lang.RuntimeException:无法连接到相机服务
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.hardware.Camera.native_setup(本机方法)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.hardware.Camera<&初始化GT;(Camera.java:258)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.hardware.Camera.open(Camera.java:235)
07-01 16:11:12.653:E / AndroidRuntime(1140):在vcore.java.MainActivity.surfaceCreated(MainActivity.java:95)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.SurfaceView.updateWindow(SurfaceView.java:543)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.SurfaceView.dispatchDraw(SurfaceView.java:348)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewGroup.drawChild(ViewGroup.java:1644)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewGroup.drawChild(ViewGroup.java:1644)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.View.draw(View.java:6883)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.widget.FrameLayout.draw(FrameLayout.java:357)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.View.draw(View.java:6883)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.widget.FrameLayout.draw(FrameLayout.java:357)
07-01 16:11:12.653:E / AndroidRuntime(1140):在com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1862)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewRoot.draw(ViewRoot.java:1522)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.os.Handler.dispatchMessage(Handler.java:99)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.os.Looper.loop(Looper.java:123)
07-01 16:11:12.653:E / AndroidRuntime(1140):在android.app.ActivityThread.main(ActivityThread.java:3683)
07-01 16:11:12.653:E / AndroidRuntime(1140):在java.lang.reflect.Method.invokeNative(本机方法)
07-01 16:11:12.653:E / AndroidRuntime(1140):在java.lang.reflect.Method.invoke(Method.java:507)
07-01 16:11:12.653:E / AndroidRuntime(1140):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
07-01 16:11:12.653:E / AndroidRuntime(1140):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-01 16:11:12.653:E / AndroidRuntime(1140):在dalvik.system.NativeStart.main(本机方法)

我给自己的HTC,他们说,他们无法帮助我的人,所以我想我会在这里尽我的运气。

有谁知道如何正确地调用相机(相机preVIEW)为HTC霹雳?

如果你能提供code的例子,我将感激不尽。

我试过的事情只是一些例子是:

http://stackoverflow.com/a/4798958/1195751

HTC Desire HD的不hardware.Camera接受setParameter()方法这也没有工作。

安卓上HTC EVO(的Andr​​oid 2.1或2.2)相机preVIEW方向也不是这

我真的想尽一切办法解决这个问题,但没有得到任何工作,所以请,任何解决这个问题将是非常有益的。

更新我已经在设置权限我清单

 <?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    包=vcore.java
    安卓版code =1
    机器人:=的versionName1.0>    <采用-SDK安卓的minSdkVersion =8/>    <使用许可权的android:NAME =android.permission.INTERNET对>< /使用许可权>
    <使用许可权的android:NAME =android.permission.ACCESS_COARSE_LOCATION>< /使用许可权>
    <使用许可权的android:NAME =android.permission.ACCESS_FINE_LOCATION>< /使用许可权>
    <使用许可权的android:NAME =android.permission.ACCESS_MOCK_LOCATION>< /使用许可权>
    <使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE>< /使用许可权>
    <使用许可权的android:NAME =android.permission.RECORD_AUDIO>< /使用许可权>
    <使用许可权的android:NAME =android.permission.CAMERA>< /使用许可权>
    <使用许可权的android:NAME =android.permission.WRITE_EXTERNAL_STORAG​​E>< /使用许可权>
    <使用许可权的android:NAME =android.permission.MODIFY_AUDIO_SETTINGS>< /使用许可权>
    <使用特征的android:NAME =android.hardware.camera/>
    <使用特征的android:NAME =android.hardware.camera.autofocus/>
    <使用许可权的android:NAME =android.permission.FLASHLIGHT
    机器人:permissionGroup =android.permission-group.HARDWARE_CONTROLS
    安卓的ProtectionLevel =正常/>
    <使用特征的android:NAME =android.hardware.camera.flash/>
    <使用许可权的android:NAME =android.permission.ACCESS_WIFI_STATE>< /使用许可权>
    <使用许可权的android:NAME =android.permission.CHANGE_COMPONENT_ENABLED_STATE>< /使用许可权>
    <使用许可权的android:NAME =android.permission.RECORD_VIDEO>< /使用许可权>
    <使用许可权的android:NAME =android.permission.WAKE_LOCK/>    <支持屏
        机器人:largeScreens =真
        机器人:normalScreens =真
        机器人:smallScreens =真
        机器人:anyDensity =真/>    <应用
        机器人:图标=@绘制/标志
        机器人:标签=@字符串/ APP_NAME>
        <活动
            机器人:标签=@字符串/ APP_NAME
            机器人:名字=。MainActivity
            机器人:screenOrientation =肖像>
            &所述;意图滤光器>                <作用机器人:名字=android.intent.action.MAIN/>
                <类机器人:名字=android.intent.category.LAUNCHER/>            &所述; /意图滤光器>
        < /活性GT;        <活动机器人:名字=。PushCamera
                  机器人:标签=@字符串/ APP_NAME>            < - 安卓!screenOrientation =肖像 - >
        < /活性GT;
         <活动机器人:名字=ImageDisplayActivity>< /活性GT;
    < /用途>< /清单>

更新2

 公共无效surfaceCreated(SurfaceHolder持有人){
        尝试{
            如果(mCamera!= NULL){
                尝试{
                    mCamera.stop preVIEW();
                }赶上(例外忽略){
                }
                尝试{
                    mCamera.release();
                }赶上(例外忽略){
                }
                mCamera = NULL;
            }            mCamera = Camera.open();
            mCamera.set previewDisplay(支架);
        }赶上(例外前){
            尝试{
                如果(mCamera!= NULL){
                    尝试{
                        mCamera.stop preVIEW();
                    }赶上(例外忽略){
                    }
                    尝试{
                        mCamera.release();
                    }赶上(例外忽略){
                    }
                    mCamera = NULL;
                }
            }赶上(例外忽略){            }
        }
    }    公共无效surfaceDestroyed(SurfaceHolder持有人){
        尝试{
            如果(mCamera!= NULL){
                尝试{
                    mCamera.stop preVIEW();
                }赶上(例外忽略){
                }
                尝试{
                    mCamera.release();
                }赶上(例外忽略){
                }
                mCamera = NULL;
            }
        }赶上(例外前){
            ex.printStackTrace();
        }
    }    公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释W,INT高){
    Log.e(TAGsurfaceChanged);
    尝试{
        Camera.Parameters参数= mCamera.getParameters();
        尝试{
            清单< Camera.Size> supportedSizes = NULL;
            //在旧设备上(小于1.6)以下将失败
            //相机仍将正常工作
            supportedSizes = parameters.getSupported previewSizes();            // preVIEW外形
            浮FF =(浮点)W / H;
            Log.d(Mixare,屏幕解析度:W:+宽+H:+ H +宽高比+ FF);            //对于最好的外形和大小保持器
            浮BFF = 0;
            INT bestw = 0;
            INT besth = 0;
            迭代器< Camera.Size> ITR = supportedSizes.iterator();            //我们寻找最佳preVIEW大小,它是最接近
            //屏幕的外形,并且会比屏幕本身更窄
            //后者的要求是因为HTC Hero的升级与2.1将
            //报告相机preVIEW尺寸比屏幕大,它会失败
            //初始化摄​​像头
            //其它设备可以与previews大于屏幕工作,虽然
            而(itr.hasNext()){
                Camera.Size元= itr.next();
                //当前外形
                浮CFF =(浮点)element.width / element.height;
                //检查当前的元素取代的最佳匹配,到目前为止候选人
                //当前外形应该是接近BFF
                // preVIEW宽度应小于屏幕宽度
                // preVIEW宽度应比目前更bestw
                //这种组合将确保最高分辨率将赢得
                Log.d(Mixare,候选摄像机元素:W:+ element.width +H:+ element.height +宽高比+ CFF);
                如果((FF-CFF&下; = FF-BFF)及及(element.width&下; = W)及及(element.width&GT = bestw)){
                    BFF = CFF;
                    bestw = element.width;
                    besth = element.height;
                }
            }
            Log.d(Mixare,被选中的摄像头元素:W:+ bestw +H:+ besth +宽高比+ BFF);
            //一些三星手机将最终bestw和besth = 0,因为他们的最低preVIEW尺寸更大然后是屏幕尺寸。
            //在这种情况下,我们使用默认值:小480x320
            如果((bestw == 0)||(besth == 0)){
                Log.d(Mixare,使用默认的摄像头参数!);
                bestw = 480;
                besth = 320;
            }
            parameters.set previewSize(bestw,besth);
        }赶上(例外前){
            parameters.set previewSize(480,320);
        }        mCamera.setParameters(参数);
        mCamera.start preVIEW();
    }赶上(例外前){
        ex.printStackTrace();
    }}


解决方案

 公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释W,INT高){    如果(是previewRunning){
        camera.stop preVIEW();
    }
    尝试{
    Camera.Parameters p值= camera.getParameters();
    如果(P!= NULL){
    清单<尺寸和GT;大小= p.getSupported previewSizes();
    大小optimalSize = getOptimal previewSize(尺寸,W,H);
    P.SET previewSize(optimalSize.width,optimalSize.height);
    camera.setParameters(P);    camera.set previewDisplay(持有人);;
    camera.start preVIEW();    }
    }赶上(IOException异常五){
        // TODO自动生成catch块
        e.printStackTrace();
    }    为previewRunning = TRUE;
}
私人尺寸getOptimal previewSize(列表<尺寸和GT;的大小,INT W,INT高){
    // TODO自动生成方法存根
    最终双ASPECT_TOLERANCE = 0.05;
    双targetRatio =(双)W / H;
    如果(大小== NULL)返回NULL;    大小optimalSize = NULL;
    双minDiff = Double.MAX_VALUE;    INT targetHeight = H;    //尝试找到一个大小匹配纵横比和尺寸
    对于(尺寸大小:大小){
    双率=(双)size.width / size.height;
    如果(Math.abs(比 - targetRatio)GT; ASPECT_TOLERANCE)继续;
    如果(Math.abs(size.height - targetHeight)LT; minDiff){
    optimalSize =大小;
    minDiff = Math.abs(size.height - targetHeight);
    }
    }    //找不到一个长宽比匹配,忽略此要求
    如果(optimalSize == NULL){
    minDiff = Double.MAX_VALUE;
    对于(尺寸大小:大小){
    如果(Math.abs(size.height - targetHeight)LT; minDiff){
    optimalSize =大小;
    minDiff = Math.abs(size.height - targetHeight);
    }
    }
    }
    返回optimalSize;
}

将这个code在surfaceChanged()。
getOptimal previewSize()用于根据设备分辨率设置preVIEW参数。
所以相机preVIEW打开时它不会崩溃。
尝试这个。
这工作适合我在不同的设备。

I am new to android app development so please any answers would be great with code examples.

My problem is this, I have to develop a camera app that streams mjpeg to a server.

Now I have successfully created the app for my Motorola Atrix and that works great. My problem is after I signed and exported that app and installed it on an HTC Thunderbolt for additional device testing, I found that it freezes when I try to call for the camera and the app crashes.

Since then I have tried every example/sample code for camera preview on the web and in these forums especially and I constantly get the same results. I get it to work on my Atrix but not on the thunderbolt.

When the app runs on the thunderbolt I get this:

07-01 16:11:12.643: D/AndroidRuntime(1140): Shutting down VM
07-01 16:11:12.643: W/dalvikvm(1140): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-01 16:11:12.653: E/AndroidRuntime(1140): FATAL EXCEPTION: main
07-01 16:11:12.653: E/AndroidRuntime(1140): java.lang.RuntimeException: Fail to connect to camera service
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.hardware.Camera.native_setup(Native Method)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.hardware.Camera.<init>(Camera.java:258)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.hardware.Camera.open(Camera.java:235)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at vcore.java.MainActivity.surfaceCreated(MainActivity.java:95)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.SurfaceView.updateWindow(SurfaceView.java:543)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:348)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.View.draw(View.java:6883)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.View.draw(View.java:6883)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewRoot.draw(ViewRoot.java:1522)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.os.Looper.loop(Looper.java:123)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at android.app.ActivityThread.main(ActivityThread.java:3683)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at java.lang.reflect.Method.invokeNative(Native Method)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at java.lang.reflect.Method.invoke(Method.java:507)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-01 16:11:12.653: E/AndroidRuntime(1140):     at dalvik.system.NativeStart.main(Native Method)

I emailed HTC themselves and they said they couldn't help me at all so I figured I would try my luck here.

Does anyone know how to properly call the camera (for a camera preview) for an HTC Thunderbolt?

If you could provide code example I would be eternally grateful.

Just some examples of the things I have tried are:

http://stackoverflow.com/a/4798958/1195751

HTC Desire HD not accepts setParameter() with hardware.Camera This also didn't work

Android: Camera Preview Orientation on HTC EVO (Android 2.1 or 2.2) Neither Did this

I have really tried everything to solve this but haven't gotten anything to work so please, any solution to this problem would be extremely helpful.

UPDATE I already have the permissions set in my manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="vcore.java"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.FLASHLIGHT"
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
    android:protectionLevel="normal"/>
    <uses-feature android:name="android.hardware.camera.flash" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"></uses-permission>
    <uses-permission android:name="android.permission.RECORD_VIDEO"></uses-permission> 
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <supports-screens
        android:largeScreens="true"   
        android:normalScreens="true"
        android:smallScreens="true"
        android:anyDensity="true" />

    <application
        android:icon="@drawable/logo"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".MainActivity"
            android:screenOrientation="portrait" >
            <intent-filter >

                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>
        </activity>

        <activity android:name=".PushCamera"
                  android:label="@string/app_name">

            <!--   android:screenOrientation="portrait"  -->
        </activity>
         <activity android:name="ImageDisplayActivity"></activity>
    </application>

</manifest>

UPDATE 2

public void surfaceCreated(SurfaceHolder holder) {
        try {
            if (mCamera != null) {
                try {
                    mCamera.stopPreview();
                } catch (Exception ignore) {
                }
                try {
                    mCamera.release();
                } catch (Exception ignore) {
                }
                mCamera = null;
            }

            mCamera = Camera.open();
            mCamera.setPreviewDisplay(holder);
        } catch (Exception ex) {
            try {
                if (mCamera != null) {
                    try {
                        mCamera.stopPreview();
                    } catch (Exception ignore) {
                    }
                    try {
                        mCamera.release();
                    } catch (Exception ignore) {
                    }
                    mCamera = null;
                }
            } catch (Exception ignore) {

            }
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        try {
            if (mCamera != null) {
                try {
                    mCamera.stopPreview();
                } catch (Exception ignore) {
                }
                try {
                    mCamera.release();
                } catch (Exception ignore) {
                }
                mCamera = null;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    Log.e(TAG, "surfaceChanged");
    try {
        Camera.Parameters parameters = mCamera.getParameters();
        try {
            List<Camera.Size> supportedSizes = null;
            //On older devices (<1.6) the following will fail
            //the camera will work nevertheless
            supportedSizes = parameters.getSupportedPreviewSizes();

            //preview form factor
            float ff = (float)w/h;
            Log.d("Mixare", "Screen res: w:"+ w + " h:" + h + " aspect ratio:" + ff);

            //holder for the best form factor and size
            float bff = 0;
            int bestw = 0;
            int besth = 0;
            Iterator<Camera.Size> itr = supportedSizes.iterator();

            //we look for the best preview size, it has to be the closest to the
            //screen form factor, and be less wide than the screen itself
            //the latter requirement is because the HTC Hero with update 2.1 will
            //report camera preview sizes larger than the screen, and it will fail
            //to initialize the camera
            //other devices could work with previews larger than the screen though
            while(itr.hasNext()) {
                Camera.Size element = itr.next();
                //current form factor
                float cff = (float)element.width/element.height;
                //check if the current element is a candidate to replace the best match so far
                //current form factor should be closer to the bff
                //preview width should be less than screen width
                //preview width should be more than current bestw
                //this combination will ensure that the highest resolution will win
                Log.d("Mixare", "Candidate camera element: w:"+ element.width + " h:" + element.height + " aspect ratio:" + cff);
                if ((ff-cff <= ff-bff) && (element.width <= w) && (element.width >= bestw)) {
                    bff=cff;
                    bestw = element.width;
                    besth = element.height;
                }
            } 
            Log.d("Mixare", "Chosen camera element: w:"+ bestw + " h:" + besth + " aspect ratio:" + bff);
            //Some Samsung phones will end up with bestw and besth = 0 because their minimum preview size is bigger then the screen size.
            //In this case, we use the default values: 480x320
            if ((bestw == 0) || (besth == 0)){
                Log.d("Mixare", "Using default camera parameters!");
                bestw = 480;
                besth = 320;
            }
            parameters.setPreviewSize(bestw, besth);
        } catch (Exception ex) {
            parameters.setPreviewSize(480 , 320);
        }

        mCamera.setParameters(parameters);
        mCamera.startPreview();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

}

解决方案

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {



    if (isPreviewRunning) {
        camera.stopPreview();
    }
    try{
    Camera.Parameters p = camera.getParameters();
    if(p!=null){
    List<Size> sizes = p.getSupportedPreviewSizes();
    Size optimalSize = getOptimalPreviewSize(sizes, w, h);
    p.setPreviewSize(optimalSize.width, optimalSize.height);
    camera.setParameters(p);

    camera.setPreviewDisplay(holder);;
    camera.startPreview();

    }
    } catch (IOException e) {
        // TODO Auto-generated catch block


        e.printStackTrace();
    }

    isPreviewRunning = true;
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
    // TODO Auto-generated method stub
    final double ASPECT_TOLERANCE = 0.05;
    double targetRatio = (double) w / h;
    if (sizes == null) return null;

    Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    // Try to find an size match aspect ratio and size
    for (Size size : sizes) {
    double ratio = (double) size.width / size.height;
    if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
    if (Math.abs(size.height - targetHeight) < minDiff) {
    optimalSize = size;
    minDiff = Math.abs(size.height - targetHeight);
    }
    }

    // Cannot find the one match the aspect ratio, ignore the requirement
    if (optimalSize == null) {
    minDiff = Double.MAX_VALUE;
    for (Size size : sizes) {
    if (Math.abs(size.height - targetHeight) < minDiff) {
    optimalSize = size;
    minDiff = Math.abs(size.height - targetHeight);
    }
    }
    }
    return optimalSize;
}

Put this code in your surfaceChanged(). getOptimalPreviewSize() is used to set preview parameters according to device resolution. So it will not crash when camera preview is opened. Try this. This works good for me in different devices.

这篇关于无法获取相机preVIEW(通话摄像头),HTC霹雳的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆