0

Android用の画像編集アプリを作成しようとしていますが、始めたばかりで、すでに問題が発生しています。写真を撮ってSDカードに保存できます。しかし、アプリが実行しているいくつかのエフェクトを実行しようとしましたが、そのエフェクトはプレビューに表示されません。これが私が使用する完全なコードです:

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();

}}

誰かが私のエフェクトのコードの何が問題になっているのか教えてもらえますか?それを行う他の方法はありますか?

これが、サポートされているエフェクトを取得してループするために使用したコードです。

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;
}
}

これにより、nullポインター例外が発生します。そこで、colorEffectsがデータまたは効果を保持しているかどうかを確認しようとしました。このようなifループを使用しました

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

そしてそれはnullでした。なんで?ダウンロードしたSDKに問題はありますか?android2.3SDKをダウンロードする必要があります。現在、2.2SDKをダウンロードしています。ところで、タイプするだけでも

parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);

getSupportedColorEffects()メソッドを使用しない場合、エラーなしで実行されますが、効果はプレビューに表示されません。

ログ猫情報:

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)

このエラーは、次のコード行を入力すると発生します。

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;
    }
    }
4

1 に答える 1

1

これらの行を入れてみてください:

Camera.Parameters parameters = camera.getParameters();

parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);

camera.setParameters(parameters);

メソッドにsurfaceChanged

これは、 AndroidDevelopersReferenceからコピーしたサンプルコードです。

 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());
        }
    }

この参考資料によるとsurfaceChanged、コメントの内容と同じようにメソッドを変更することをお勧めします。

プレビューのサイズを変更する同様のアプリがあり、ガイドに従いました。では、この方法を試してみませんか?

于 2012-12-17T11:18:17.310 に答える