Custom Camera Preview

L

Lybrial

Neues Mitglied
0
Hallo,

ich würde gerne die Kamera meines Android Device nutzen,
um Bilder innerhalb meiner App zu knipsen. Ich würde dafür
die Kamera-Vorschau gerne in einer View zusammen mit
zwei Buttons haben. Das Problem: Ich finde nirgendwo ein
funktionierendes Beispiel. So habe ich z. B. das hier versucht:

Camera Preview Example in Android Programming

Leider bekomme ich da aber immer einen Fehler:

Code:
Fail to connect to camera service.

Bei der Zeile

Code:
mCamera = Camera.open();

Hätte jemand eine Erklärung oder ein funktionierendes Beispiel, wie ich eine
eigene Kamera-Anwendung programmieren kann?
 
Correct, den sollte ich natürlich liefern. Ich liefere auch gleich den Code dazu.

Stack:

Code:
11-28 10:54:56.035: W/CameraBase(3807): An error occurred while connecting to camera: 0
11-28 10:54:56.035: W/System.err(3807): java.lang.RuntimeException: Fail to connect to camera service
11-28 10:54:56.036: W/System.err(3807): 	at android.hardware.Camera.<init>(Camera.java:497)
11-28 10:54:56.036: W/System.err(3807): 	at android.hardware.Camera.open(Camera.java:357)
11-28 10:54:56.036: W/System.err(3807): 	at de.activities.fragments.RecipeFragment.getCameraInstance(RecipeFragment.java:87)
11-28 10:54:56.036: W/System.err(3807): 	at de.activities.fragments.RecipeFragment.onCreate(RecipeFragment.java:42)
11-28 10:54:56.036: W/System.err(3807): 	at android.support.v4.app.Fragment.performCreate(Fragment.java:1481)
11-28 10:54:56.036: W/System.err(3807): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:908)
11-28 10:54:56.036: W/System.err(3807): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
11-28 10:54:56.036: W/System.err(3807): 	at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
11-28 10:54:56.036: W/System.err(3807): 	at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
11-28 10:54:56.036: W/System.err(3807): 	at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:571)
11-28 10:54:56.036: W/System.err(3807): 	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)
11-28 10:54:56.036: W/System.err(3807): 	at android.app.Activity.performStart(Activity.java:5949)
11-28 10:54:56.036: W/System.err(3807): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
11-28 10:54:56.037: W/System.err(3807): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
11-28 10:54:56.037: W/System.err(3807): 	at android.app.ActivityThread.access$800(ActivityThread.java:144)
11-28 10:54:56.037: W/System.err(3807): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
11-28 10:54:56.037: W/System.err(3807): 	at android.os.Handler.dispatchMessage(Handler.java:102)
11-28 10:54:56.037: W/System.err(3807): 	at android.os.Looper.loop(Looper.java:135)
11-28 10:54:56.037: W/System.err(3807): 	at android.app.ActivityThread.main(ActivityThread.java:5221)
11-28 10:54:56.037: W/System.err(3807): 	at java.lang.reflect.Method.invoke(Native Method)
11-28 10:54:56.037: W/System.err(3807): 	at java.lang.reflect.Method.invoke(Method.java:372)
11-28 10:54:56.037: W/System.err(3807): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-28 10:54:56.037: W/System.err(3807): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

CameraPreview:

Code:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
	private SurfaceHolder surfaceHolder = null;
	private Camera camera;

	public CameraPreview(Context context, Camera camera) {
		super(context);
		
		this.camera = camera;
		this.surfaceHolder = this.getHolder();
		this.surfaceHolder.addCallback(this);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		try {
			this.camera.setPreviewDisplay(holder);
			this.camera.startPreview();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		if (surfaceHolder.getSurface() == null) {
			return;
		}

		try {
			this.camera.stopPreview();
		} catch (Exception e) {}

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

CameraFragment:

Code:
public class CameraFragment extends Fragment {
	private Camera camera = null;
    private CameraPreview cameraPreview = null;
	private Button buttonAddPhoto = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        this.camera = this.getCameraInstance();
        this.cameraPreview = new CameraPreview(this.getActivity().getApplicationContext(), this.camera);
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
		return inflater.inflate(R.layout.activity_recipe_fragment, container, false);
	}
	
	@Override
	public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
		
		FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.recipe_fragment_camera_preview);
        frameLayout.addView(this.cameraPreview);
 
		this.buttonAddPhoto = (Button) view.findViewById(R.id.recipe_button_take_photo);
		this.buttonAddPhoto.bringToFront();
	}
	
	@Override
    public void onPause() {
    	super.onPause();
    	
    	this.releaseCamera();
    	
    }
	
    private Camera getCameraInstance() {
        Camera camera = null;
        
        try {
            camera = Camera.open();
        } catch (Exception e){
        	e.printStackTrace();
        }
        
        return camera;
    }
 
    private void releaseCamera(){
        if (this.camera != null){
            this.camera.release();
            this.camera = null;
        }
    }
}

CameraActivity:

Code:
public class CameraActivity extends NavigationActivity {
	private FragmentManager fragmentManager = null;
	private CameraFragment recipeFragment = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
//		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//      this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
		
		super.onCreate(savedInstanceState);
		
		this.fragmentManager = this.getSupportFragmentManager();
		this.cameraFragment = (CameraFragment) this.fragmentManager.findFragmentByTag(FragmentTags.CAMERA.getValue());

		if (savedInstanceState == null) {
			this.cameraFragment = new CameraFragment();
			this.fragmentManager.beginTransaction().replace(R.id.menu_slide_main_content, this.cameraFragment, FragmentTags.CAMERA.getValue()).commit();
		}
	}
}
 
Hallo,

habe da so einen Verdacht. Könntest du dein Manifest posten?

Gruß
Xilent
 
Ich denke dich interessiert hauptsächlich der obere Teil:

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

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />
    
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    <uses-feature android:name="android.hardware.camera" android:required="false" />
 	<uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.NFC" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:theme="@android:style/Theme.DeviceDefault.Light"
        android:label="@string/app_name" >
        
        ...

</manifest>
 
Lybrial schrieb:
Ich denke dich interessiert hauptsächlich der obere Teil

Da hast du vollkommen recht. Ich sehe du benutzt die Kamera features, forderst aber nie die Rechte für die Kamera selber ein.

Füge mal das zu deinen Permissions hinzu:
Code:
<uses-permission android:name="android.permission.CAMERA"/>

Gruß
Xilent
 
  • Danke
Reaktionen: Lybrial
Tatsache! Vollkommen richtig. Vielen Dank, Problem ist gelöst!
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.050
jogimuc
J
J
Antworten
2
Aufrufe
983
justinh13
J
J
Antworten
2
Aufrufe
691
JoEntwickler
J
Zurück
Oben Unten