Android相机效果不工作 [英] Android Camera Effects Not Working

查看:153
本文介绍了Android相机效果不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图建立Android图像编辑应用程序,我才刚刚开始,并且已经遇到麻烦。那么我可以拍照并保存到SD卡。但我尽量做一些特效的应用程序正在运行,但影响不会在preVIEW显示出来。继承人的完整code,我使用:

 包com.example.camerademo;进口java.io.IOException异常;进口android.app.Activity;进口android.hardware.Camera;进口android.os.Bundle;进口android.view.SurfaceHolder;进口android.view.SurfaceView;公共类MainActivity扩展活动器具SurfaceHolder.Callback {SurfaceView cameraView;SurfaceHolder surfaceHolder;摄像头摄像头;@覆盖公共无效的onCreate(捆绑savedInstanceState){super.onCreate(savedInstanceState);的setContentView(R.layout.activity_main);cameraView =(SurfaceView)this.findViewById(R.id.C​​ameraView);surfaceHolder = cameraView.getHolder();surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceHolder.addCallback(本);
}@覆盖公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释的宽度,高度INT){    // TODO自动生成方法存根    camera.start preVIEW();
}@覆盖公共无效surfaceCreated(SurfaceHolder持有人){    // TODO自动生成方法存根    相机= Camera.open();    尝试{    camera.set previewDisplay(支架);    Camera.Parameters参数= camera.getParameters();    parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);    camera.setParameters(参数);    }    赶上(IOException异常除外)    {    camera.release();    }    }@覆盖公共无效surfaceDestroyed(SurfaceHolder持有人){    // TODO自动生成方法存根    camera.stop preVIEW();    camera.release();}}

谁能告诉我什么是错我的code的作用。是一个任何其他方式
的干什么呢?

继承人的code I用于通过它来获得支持的特效和循环。

 列表<串GT; colorEffects = parameters.getSupportedColorEffects();
迭代器<串GT; CEI = colorEffects.iterator();
而(cei.hasNext())
{
串currentEffect = cei.next();
如果(currentEffect.equals(Camera.Parameters.EFFECT_NEGATIVE))
{
parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
打破;
}
}

这给了我一个空指针异常..所以我想看看是否colorEffects持有任何数据或影响。我用了一个循环,如果像这样

 如果(colorEffects == NULL){
editText.setText(空);
}

和它为空。为什么?有一些问题,下载的SDK。我应该下载的Andr​​oid 2.3 SDK。目前,我有2.2的SDK下载。顺便说一句,即使只需键入

  parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);

不使用getSupportedColorEffects()方法,它运行没有错误,但效果不会在preVIEW显示出来。

日志猫信息:

  01-01 00:08:17.588:E / AndroidRuntime(297):致命异常:主要
01-01 00:08:17.588:E / AndroidRuntime(297):显示java.lang.NullPointerException
01-01 00:08:17.588:E / AndroidRuntime(297):在com.example.camerademo.MainActivity.surfaceCreated(MainActivity.java:56)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.SurfaceView.updateWindow(SurfaceView.java:532)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.drawChild(ViewGroup.java:1638)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.drawChild(ViewGroup.java:1638)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.View.draw(View.java:6743)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.widget.FrameLayout.draw(FrameLayout.java:352)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.drawChild(ViewGroup.java:1640)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.drawChild(ViewGroup.java:1638)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.View.draw(View.java:6743)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.widget.FrameLayout.draw(FrameLayout.java:352)
01-01 00:08:17.588:E / AndroidRuntime(297):在com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1842)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewRoot.draw(ViewRoot.java:1407)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.os.Handler.dispatchMessage(Handler.java:99)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.os.Looper.loop(Looper.java:123)
01-01 00:08:17.588:E / AndroidRuntime(297):在android.app.ActivityThread.main(ActivityThread.java:4627)
01-01 00:08:17.588:E / AndroidRuntime(297):在java.lang.reflect.Method.invokeNative(本机方法)
01-01 00:08:17.588:E / AndroidRuntime(297):在java.lang.reflect.Method.invoke(Method.java:521)
01-01 00:08:17.588:E / AndroidRuntime(297):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
01-01 00:08:17.588:E / AndroidRuntime(297):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-01 00:08:17.588:E / AndroidRuntime(297):在dalvik.system.NativeStart.main(本机方法)

当我进入这一行code的会出现此错误:

 列表<串GT; colorEffects = parameters.getSupportedColorEffects();
    迭代器<串GT; CEI = colorEffects.iterator();
    而(cei.hasNext())
    {
    串currentEffect = cei.next();
    如果(currentEffect.equals(Camera.Parameters.EFFECT_NEGATIVE))
    {
    parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
    打破;
    }
    }


解决方案

您可以尝试把这些行:

  Camera.Parameters参数= camera.getParameters();parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);camera.setParameters(参数);

surfaceChanged 方法?

这是样品code,我从的Andr​​oid复制开发者参考

 公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释W,INT高){
        //如果你的preVIEW可以更改或旋转,把这些事件的关心在这里。
        //确保调整或重新格式化之前停止preVIEW。        如果(mHolder.getSurface()== NULL){
          // preVIEW表面不存在
          返回;
        }        在进行更改之前//停止preVIEW
        尝试{
            mCamera.stop preVIEW();
        }赶上(例外五){
          //忽略:试图停止不存在的preVIEW
        }        //设置preVIEW大小并进行缩放,旋转或
        //重新格式化这里的变化        //启动preVIEW新设置
        尝试{
            mCamera.set previewDisplay(mHolder);
            mCamera.start preVIEW();        }赶上(例外五){
            Log.d(TAG,错误启动摄像头preVIEW:+ e.getMessage());
        }
    }

根据这一基准,这是建议把就像评论所说的话在 surfaceChanged 方法的任何更改。

我有类似的应用程序,这将改变preVIEW的大小,我跟着导游。所以,你可以试试这个方法?

I'm trying to build an image editing app for android and I've just started and already I'm having trouble. Well I can take a picture and save to the sd card. But i try to do some effects the app is running but the effects don't show up in the preview. Heres the complete code that i use:

package com.example.camerademo;

import java.io.IOException;

import android.app.Activity;

import android.hardware.Camera;

import android.os.Bundle;

import android.view.SurfaceHolder;

import android.view.SurfaceView;



public class MainActivity extends Activity implements 

SurfaceHolder.Callback {

SurfaceView cameraView;

SurfaceHolder surfaceHolder;

Camera camera;





@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

cameraView = (SurfaceView) this.findViewById(R.id.CameraView);

surfaceHolder = cameraView.getHolder();

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceHolder.addCallback(this);


}





@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {

    // TODO Auto-generated method stub



    camera.startPreview();


}

@Override

public void surfaceCreated(SurfaceHolder holder) {

    // TODO Auto-generated method stub

    camera = Camera.open();

    try {

    camera.setPreviewDisplay(holder);

    Camera.Parameters parameters = camera.getParameters();

    parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);

    camera.setParameters(parameters);



    }

    catch (IOException exception)

    {

    camera.release();

    }

    }



@Override

public void surfaceDestroyed(SurfaceHolder holder) {

    // TODO Auto-generated method stub

    camera.stopPreview();

    camera.release();

}}

Can anyone please tell me what is wrong with my code for effects. Is the a any other way of doing it?

Heres the code i used to get the supported effects and loop through it.

List<String> colorEffects = parameters.getSupportedColorEffects();
Iterator<String> cei = colorEffects.iterator();
while (cei.hasNext())
{
String currentEffect = cei.next();
if (currentEffect.equals(Camera.Parameters.EFFECT_NEGATIVE))
{
parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
break;
}
}

This gives me a null pointer exception.. So i tried to see if colorEffects holds any data or effects. I used an if loop like this

if(colorEffects == null){
editText.setText("Null");
}

And it was null. Why? Is there some problem with the downloaded sdk. Should I download android 2.3 SDK. Currently i have 2.2 SDK downloaded. Btw even if just type

parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);

without using getSupportedColorEffects() method it runs without errors but the effect doesn't show up in preview.

Log Cat Information:

01-01 00:08:17.588: E/AndroidRuntime(297): FATAL EXCEPTION: main
01-01 00:08:17.588: E/AndroidRuntime(297): java.lang.NullPointerException
01-01 00:08:17.588: E/AndroidRuntime(297):  at com.example.camerademo.MainActivity.surfaceCreated(MainActivity.java:56)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.SurfaceView.updateWindow(SurfaceView.java:532)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.View.draw(View.java:6743)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.widget.FrameLayout.draw(FrameLayout.java:352)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.View.draw(View.java:6743)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.widget.FrameLayout.draw(FrameLayout.java:352)
01-01 00:08:17.588: E/AndroidRuntime(297):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewRoot.draw(ViewRoot.java:1407)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.os.Looper.loop(Looper.java:123)
01-01 00:08:17.588: E/AndroidRuntime(297):  at android.app.ActivityThread.main(ActivityThread.java:4627)
01-01 00:08:17.588: E/AndroidRuntime(297):  at java.lang.reflect.Method.invokeNative(Native Method)
01-01 00:08:17.588: E/AndroidRuntime(297):  at java.lang.reflect.Method.invoke(Method.java:521)
01-01 00:08:17.588: E/AndroidRuntime(297):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-01 00:08:17.588: E/AndroidRuntime(297):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-01 00:08:17.588: E/AndroidRuntime(297):  at dalvik.system.NativeStart.main(Native Method)

This error occurs when i enter this line of code:

List<String> colorEffects = parameters.getSupportedColorEffects();
    Iterator<String> cei = colorEffects.iterator();
    while (cei.hasNext())
    {
    String currentEffect = cei.next();
    if (currentEffect.equals(Camera.Parameters.EFFECT_NEGATIVE))
    {
    parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
    break;
    }
    }

解决方案

Could you try put these lines:

Camera.Parameters parameters = camera.getParameters();

parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);

camera.setParameters(parameters);

into surfaceChanged method?

This is the sample code I copied from Android Developers Reference:

 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null){
          // preview surface does not exist
          return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }

According to this reference, it is recommend to put any changes in surfaceChanged method just like the what the comments are saying.

I've similar app that will change the size of preview and I followed the guide. So could you try this method?

这篇关于Android相机效果不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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