# CameraView - Absturz



## programmierer12 (23. Apr 2014)

Hallo zusammen,
ich habe mir vor kurzem ein Buch über die Programmierung von Android Apps gekauft in dem auch das einbinden der Kamera behandelt wird. Ich habe den Code 1 zu 1 abgetippt und in meine eigene App eingebaut doch wenn ich die app dann start stürtzt sie dauernd ab. Es wird eine Meldung angezeige: AppName wurde angehalte. Was kann ich denn da tun ? 
Es soll eigentlich nur ein Bild gemacht werden, dass dann von der App weiterverwendet werden kann.

MFG
programmierer12


----------



## dzim (23. Apr 2014)

Schon was über Logcat gelesen? Da kommen die Stacktraces raus. Ohne einen Stacktrace und/oder Informationen über den Code (bzw. Codeschnipsel) wäre es reines Rätselraten...


----------



## programmierer12 (23. Apr 2014)

Also das ist meine Klasse mit der ich die Kamera(-Vorschau) aufrufen will, das ganze ist im Prinzip ein Widget dass ich in meiner xml Layout-File einbinde.


```
import java.io.IOException;

import android.content.Context;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {

	SurfaceHolder surfaceHolder;
	Camera camera;

	public CameraView(Context context, AttributeSet attrs) {
		super(context, attrs);
		surfaceHolder = getHolder();
		surfaceHolder.addCallback(this);
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public CameraView(Context context) {
		super(context);
		surfaceHolder = getHolder();
		surfaceHolder.addCallback(this);
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void surfaceCreated(SurfaceHolder holder) {
		camera = Camera.open();
		camera.setDisplayOrientation(90);
		try {
			camera.setPreviewDisplay(holder);
		} catch (IOException exception) {
			camera.release();
			camera = null;
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		camera.stopPreview();
		camera.release();
		camera = null;
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		try {
			Camera.Parameters parameters = camera.getParameters();
			parameters.setPreviewSize(w, h);
			camera.setParameters(parameters);
		} catch (Exception e) {
			Log.w("CameraView", "Exception: " , e);
		}
		camera.startPreview();
	}
	
	public void setOneShotPreviewCallback(PreviewCallback callback) {
		if(camera!=null) {
			camera.setOneShotPreviewCallback(callback);
		}
	}

}
```

Ich hoffe das hilft was! 

PS. : es wird KEINE Exception geworfen und ich werde auch nicht aufgefordert den Debuggmode zu öffnen um Fehler zu suchen/finden.

MFG
programmierer12


----------



## programmierer12 (23. Apr 2014)

Noch ein kleiner ScreenShot der dir eventuell helfen könnte!


----------



## dzim (23. Apr 2014)

Die Console ist in dem Fall wertlos. Öffne den View "LogCat"...
In Eclipse: Window > Show View > Other... [ein Dialog öffnet sich] Android > LogCat
Wenn du schon dabei bist, öffne dir auch gleich noch den Device-View (selbe Prozedur). Dort kann man auch Screenshots des Geräts machen.

Noch eine Frage: Emulator oder echtes Gerät? (Zweites ist immer Besser, wegen der Performance, es sei denn du nutzt so was wie Genymotion.)

#edit: BTW... Man sieht, das es eine RuntimException gibt (oberster Eintrag in der Debug-Konsole). Also gilt erst recht: Logcat muss ran.


----------



## programmierer12 (23. Apr 2014)

Also ich benutze mein echtes Handy über den Entwicklermodus. In der LogCat log.txt steht folgendes drinn:
?:??: W/?(?): Unable to open log device '/dev/log/main': No such file or directory
Ansonsten kann ich dir nur noch einen ScreenShot der Meldung auf meinem Gerät zeigen wenn es etwas bringt.

MFG
programmierer12


----------



## dzim (23. Apr 2014)

Ja vielleicht sinnvoll. Zeig mal (am besten ausgeschnittene) Screenshots vom Device- und vom LogCat-View.


----------



## programmierer12 (23. Apr 2014)

Für mich schaut das ganze zwar wertlos aus aber hier die ScreenShots.
Und nochmal eine grundlegende Frage: Das CameraView "Widget" muss ich ja nur auf meine Xml LayoutFile ziehen, oder mache ich da etwas gewaltig falsch?

MFG
programmierer12


----------



## dzim (23. Apr 2014)

Hat deine App keinen ordentlichen Package-Namen? Oder heisst der echt com.sec.FactoryClient? Was steht in deiner Manifest-Datei drin?

Ist das ein gerootetes Gerät (meine Testgeräte zeigen nie so viele Prozesse an)?

Kann es sein, das du noch auf dem Gerät den debug-Mode bestätigen musst (mich fragen die Telefone, wenn ich sie das erste mal anhänge immer, ob ich Verbindungen vom Gerät XYZ (irgend eine MAC oder so) zulassen möchte).

Disconnected klingt ja, als wäre während des debuggens das Gerät vom USB entfernt worden...


----------



## programmierer12 (23. Apr 2014)

Doch meine App hat einen ordentlichen Package-Namen! 
Der Code meiner Manifest ist das hier:
[XML]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.dietz.cleaner"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.CAMERA"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="de.dietz.cleaner.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

[/XML]

Ja mein Handy ist gerootet!
Und ich musste noch nie den Debug-Mode bestätigen!

PS. : Wenn ich die Kamera nicht benutzen will funktioniert das ganze einwandfrei!!!!

MFG
programmierer12


----------



## dzim (24. Apr 2014)

Sorry, aber ohne dein komplettes Projekt zu kennen und selbst zu debuggen, bin ich - wenigstens im Moment - am Ende meines Lateins.


----------



## programmierer12 (25. Apr 2014)

Wenn es dir was nützt kannst du dir das Projekt als zip-Data herunterladen und es dir mal ansehen.
Download


----------



## dzim (25. Apr 2014)

Also. Bock darauf hatte ich ja eigentlich nicht, aber ich bin ja kein *****. Ich hab erst mal dein Projekt aufgeräumt...

TODO (für dich)

- lösche in libs alles bis auf die "android-support-v4.jar"

- erstelle dir aus dem AppCompat ein LibraryProjekt:
-- File > Import (Dialog öffnet sich) > Android > Existing Android Code Into Workspace (Wizard für den Import geht auf)
-- Browse (wähle "<Android-SDKs-Verzeichnis>\extras\android\support\v7\appcompat")

-- Hacken an "android-support-v7-appcompat"
- Öffne Project Properties (Shortcut: Alt+Enter)

-- Lösche die beiden eingetragenen Libs aus deinem BuildPath - völliger Humbug - dort trägt man nichts ein!
-- Android > Library > Add - füge hier das Projekt von oben an

- dein .classpath war auch noch irgendwie schräg, sollte jetzt so aussehen
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="src" path="gen"/>
	<classpathentry kind="output" path="bin/classes"/>
</classpath>
[/xml]

- und deine project.properties sollten jetzt ungefähr so aussehen (wichtig hier war für mich, dass target anzupassen "android-8" ging für mich nicht - zumal du im Manifest ja eh target auf 19 gesetzt hast!)

```
target=Google Inc.:Google APIs:19
android.library=false
android.library.reference.1=../../../Android-SDKs/extras/android/support/v7/appcompat
```

Danach gab es keine Fehler mehr und ich konnte es ausführen.
Dann noch MainActivity zu CameraActivity geändert und schon erschien die Exception im Logcat-View, die hier die Probleme macht.


```
04-25 09:14:28.955: W/CameraView(2298): Exception: 
04-25 09:14:28.955: W/CameraView(2298): java.lang.RuntimeException: setParameters failed
04-25 09:14:28.955: W/CameraView(2298): 	at android.hardware.Camera.native_setParameters(Native Method)
04-25 09:14:28.955: W/CameraView(2298): 	at android.hardware.Camera.setParameters(Camera.java:1650)
04-25 09:14:28.955: W/CameraView(2298): 	at de.dietz.cleaner.CameraView.surfaceChanged(CameraView.java:55)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.SurfaceView.updateWindow(SurfaceView.java:583)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.SurfaceView.access$000(SurfaceView.java:86)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:175)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1871)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.Choreographer.doCallbacks(Choreographer.java:574)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.Choreographer.doFrame(Choreographer.java:544)
04-25 09:14:28.955: W/CameraView(2298): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
04-25 09:14:28.955: W/CameraView(2298): 	at android.os.Handler.handleCallback(Handler.java:733)
04-25 09:14:28.955: W/CameraView(2298): 	at android.os.Handler.dispatchMessage(Handler.java:95)
04-25 09:14:28.955: W/CameraView(2298): 	at android.os.Looper.loop(Looper.java:136)
04-25 09:14:28.955: W/CameraView(2298): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
04-25 09:14:28.955: W/CameraView(2298): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-25 09:14:28.955: W/CameraView(2298): 	at java.lang.reflect.Method.invoke(Method.java:515)
04-25 09:14:28.955: W/CameraView(2298): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-25 09:14:28.955: W/CameraView(2298): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-25 09:14:28.955: W/CameraView(2298): 	at dalvik.system.NativeStart.main(Native Method)
```

Das musst du erst einmal beheben.


----------



## programmierer12 (25. Apr 2014)

Okay ich bin echt sooooooooooooo glücklich dass mir doch noch zu helfen ist!  
Ich werde das ganze mal probieren zu beheben. 


Gesendet von meinem GT-I9070 mit Tapatalk


----------



## programmierer12 (25. Apr 2014)

Ich habe das ganze genau nach deiner Anleitung bearbeitet und bekomme immer noch die Meldung AppName angehalten.
Außerdem spuckt mir LogCat auch nichts anderes aus!
Was habe ich denn da falsch gemacht?

MFG
programmierer12


----------



## dzim (25. Apr 2014)

Weiss ich nicht. Ich kenne dein System nicht, dein Telefon nicht, ...
Der Rest ist nur einen Blick in die Glaskugel wert. Und die ist gerade bei der Durchsicht... (Pun intended.)

Sorry, aber weiter kann ich dir nicht mehr helfen. Das Ganze zeigt aber, das es Grundsätzlich geht, du aber irgendwie dein Set Up total verwurschtelt hast.
Du hast ja noch nicht viel drin. Erstelle am besten mal ein neues Projekt und versuche es von vorn (deinen View kannst du ja rüber kopieren).


----------



## programmierer12 (25. Apr 2014)

Also glaubst du dass mein CameraView richtig ist und keine Fehler enthält wenn du das so sagst?


----------



## dzim (25. Apr 2014)

Ich glaube der CameraView könnte funktionieren, wenn du die Exception beseitigen kannst, die ich heute früh gepostet habe. Da ich mich aber nie damit beschäftigt habe, weiss ich es allerdings auch nicht.

Die Frage ist vielleicht, was du überhaupt mit dem Teil anfangen willst, wenn es mal fertig ist. Einen Barcode-Scanner? Dann verwende lieber was fertiges (ZXing oder so). Eine Camera-App (ernsthaft? Bildbearbeitung u.s.w.? Klingt nach Renderscript und wäre wohl etwas zu heftig für dich - und auch für mich.)... Ich weiss einfach nicht, wofür du das brauchst und was du damit anstellen möchtest...


----------



## programmierer12 (25. Apr 2014)

Na ja ich möchte schon so eine Art Bildbearbeitung machen!
Ich wollte eigentlich ein Bild fotografieren und dieses dann bearbeiten und im Nachhinein wieder speichern.
Als Alternative könnte ich auch eine Datei aus der App heraus auswählen, kriege ich aber auch nicht hin.

MFG
programmierer12


----------



## dzim (25. Apr 2014)

Naja dann solltest du vielleicht erst mal irgendwie ne ganze Nummer kleiner anfangen, oder?
Also ich weiss nicht, wie gut du C kannst, aber um wirklich effektiv Bilder zu bearbeiten, wird Renderscript empfohlen und das ist wohl - sprachlich betrachtet - irgendeiner C-Variante sehr nahe... Nicht, dass es nicht auch in Java ginge, aber dort wird es deutlich teurer (aus Ressourcensicht). Und wenn du nicht mal Bilder bisher laden konntest, weiss ich nicht, wie du sie mit deiner Kamera-App speichern wolltest...
Fang lieber erst mal an wirklich dich fortzubilden, bist du dich an etwas grösseres wagst. Schreibe erst mal ein paar kleinere Apps und dann versuche es noch einmal mit dem Ganzen hier.

Sorry, das sind vielleicht harte, aber immerhin ehrlich gemeinte Worte.


----------

