android: Fail to connect to camera service on targetSdkVersion change -


i had following settings in camera apps manifest.xml:

<uses-sdk android:minsdkversion="7" android:targetsdkversion="8" /> 

now changed that:

<uses-sdk android:minsdkversion="7" android:targetsdkversion="13" /> 

problem is: app not able open camera anymore. line throws error:

this.camera = camera.open(); 

errormessage:

fail connect camera service

weird thing, way: after starting app new setting, don't camera device running anymore (all other photo apps crashing @ startup too). have restart device able use camera again.

can me that?

my preview.java class:

package net.mt.lib.cc; import java.io.ioexception; import java.util.collections; import java.util.comparator; import java.util.hashtable; import java.util.list; import net.mt.lib.tools; import org.json.jsonexception; import org.json.jsonobject; import android.app.activity; import android.app.activitymanager; import android.app.activitymanager.memoryinfo; import android.content.context; import android.hardware.camera; import android.hardware.camera.errorcallback; import android.hardware.camera.size; import android.os.build; import android.os.debug; import android.util.log; import android.view.surfaceholder; import android.view.surfaceview; import android.view.view; import android.view.viewgroup; import android.widget.toast; import com.crittercism.app.crittercism; import com.flurry.android.flurryagent; /** * * opencamera() * onsizechanged() * onlayout() * onlayout() * surfacecreated() * surfacechanged() * onlayout() */ class preview extends viewgroup implements surfaceholder.callback { // <1> private static final string tag = "preview"; surfaceholder mholder; // <2> public camera camera; // <3> surfaceview msurfaceview; basecameraactivity cameraactivity; int l2 = 0, t2 = 0, r2 = 0, b2 = 0; int padding = 20; previewcallback cb; private double downscalingfactor = 1; // size of view. gets set in onmeasure() int fullwidth, fullheight; size bestpicturesize = null; size bestpreviewsize = null; private string allresolutions; private context context; public preview(context context, previewcallback callback) { super(context); this.cb = callback; init(context); } private void init(context context) { setkeepscreenon(true); cameraactivity = (basecameraactivity) context; msurfaceview = new surfaceview(context); addview(msurfaceview); this.context = context; mholder = msurfaceview.getholder(); // <4> mholder.addcallback(this); // <5> mholder.settype(surfaceholder.surface_type_push_buffers); // <6> } public void opencamera() { log.d(tag,"opencamera()"); if (this.camera == null) { try{ this.camera = camera.open(); this.camera.seterrorcallback(new errorcallback() { @override public void onerror(int error, camera camera) { log.e(tag, "error! code:"+error); toast.maketext(cameraactivity, "camera error occured: "+error, 8000).show(); } }); requestlayout(); // -> onsizechanged() -> onlayout() }catch (exception e) { string errormessage = "manufacturer: "+build.manufacturer+"; model:"+build.model+"; camera: "+this.camera+"; stacktrace:"+tools.exception2string(e); log.d(tag,"error occured: "+errormessage); flurryagent.onerror("1", errormessage, "preview.opencamera()"); toast.maketext(cameraactivity, "uuups, sorry! not connect camera device. please restart me or phone.", 8000).show(); crittercism.loghandledexception(e); } } } @override protected void onsizechanged(int w, int h, int oldw, int oldh) { log.d(tag,"onsizechanged() "+w+" "+h); fullwidth = w; fullheight = h; if(fullwidth < fullheight){ int tmp = fullheight; fullheight = fullwidth; fullwidth = tmp; log.d(tag,"switched:"+fullwidth+"x"+fullheight); }else{ log.d(tag,"fullsize:"+fullwidth+"x"+fullheight); } if(this.camera != null){ this.setcamerapreviewsize(); this.setcamerapicturesize(); if (getchildcount() > 0) { final view child = getchildat(0); log.d(tag,"r:"+this.getpreviewright()+" l:"+this.getpreviewleft()+" b:"+this.getpreviewbottom()+" t:"+this.getpreviewtop()); child.layout(this.getpreviewleft(), this.getpreviewtop(), this.getpreviewright(), this.getpreviewbottom()); cb.previewready(getpreviewleft(), getpreviewtop(), getpreviewright()-getpreviewleft(), getpreviewbottom() - getpreviewtop(), getbestpicturesize().width, getbestpicturesize().height, (int) downscalingfactor, allresolutions); } } super.onsizechanged(w, h, oldw, oldh); } private void calcscaledpreviewsize(){ int previewwidth = getbestpreviewsize().width; int previewheight = getbestpreviewsize().height; float scaledwidth; float scaledheight; log.d(tag,"preview width: "+previewwidth+", preview height: "+previewheight); log.d(tag,"display width: "+fullwidth+", display height: "+fullheight); float previewratio = (float) previewwidth / (float) previewheight; float displayratio = (float) fullwidth / (float) fullheight; if(displayratio >= previewratio){ // display wider preview image scaledheight = fullheight - 2*padding; scaledwidth = scaledheight * previewratio; l2 = (int) (fullwidth - scaledwidth) / 2; t2 = padding; r2 = (int) (fullwidth + scaledwidth) / 2; b2 = (int) scaledheight + padding; }else{ scaledwidth = fullwidth - 2*padding; scaledheight = scaledwidth / previewratio; l2 = padding; t2 = (int) (fullheight - scaledheight) / 2; r2 = (int) scaledwidth + padding; b2 = (int) (fullheight + scaledheight) / 2; } } public int getpreviewtop() { if(this.t2 == 0){ this.calcscaledpreviewsize(); } return t2; } public int getpreviewbottom() { if(this.b2 == 0){ this.calcscaledpreviewsize(); } return b2; } public int getpreviewleft() { if(this.l2 == 0){ this.calcscaledpreviewsize(); } return l2; } public int getpreviewright() { if(this.r2 == 0){ this.calcscaledpreviewsize(); } return r2; } public int getpreviewwidth() { return this.getpreviewright()-this.getpreviewleft(); } public int getpreviewheight() { return this.getpreviewbottom()-this.getpreviewtop(); } private void setcamerapreviewsize() { camera.parameters parameters = camera.getparameters(); if(parameters.getpreviewsize() != this.getbestpreviewsize()){ parameters.setpreviewsize(this.getbestpreviewsize().width, this.getbestpreviewsize().height); this.camera.setparameters(parameters); } } private void setcamerapicturesize() { camera.parameters parameters = this.camera.getparameters(); if(parameters.getpicturesize() != this.getbestpicturesize()){ parameters.setpicturesize(getbestpicturesize().width, getbestpicturesize().height); this.camera.setparameters(parameters); } } @override protected void onlayout(boolean changed, int l, int t, int r, int b) { log.d(tag,"onlayout()"); /* if (changed && getchildcount() > 0 && this.camera != null) { final view child = getchildat(0); log.d(tag,"r:"+this.getpreviewright()+" l:"+this.getpreviewleft()+" b:"+this.getpreviewbottom()+" t:"+this.getpreviewtop()); child.layout(this.getpreviewleft(), this.getpreviewtop(), this.getpreviewright(), this.getpreviewbottom()); cameraactivity.initoverlay(this.getpreviewleft(),this.getpreviewtop(),this.getpreviewright(),this.getpreviewbottom()); }*/ } public size getbestpicturesize() { if(this.bestpicturesize == null){ this.calculateoptimalpictureandpreviewsizes(); } return bestpicturesize; } public size getbestpreviewsize() { if(this.bestpreviewsize == null){ this.calculateoptimalpictureandpreviewsizes(); } return bestpreviewsize; } // called once holder ready public void surfacecreated(surfaceholder holder) { // <7> // surface has been created, acquire camera , tell // draw. log.d(tag,"surfacecreated()"); try { if (this.camera != null) { this.camera.setpreviewdisplay(holder); } } catch (ioexception exception) { log.e(tag, "ioexception caused setpreviewdisplay()", exception); } } public void surfacechanged(surfaceholder holder, int format, int w, int h) { log.d(tag,"surfacechanged()"); if (camera != null) { camera.parameters parameters = camera.getparameters(); parameters.setpreviewsize(getbestpreviewsize().width, getbestpreviewsize().height); camera.setparameters(parameters); camera.startpreview(); cb.onpreviewstart(); requestlayout(); } } public void surfacedestroyed(surfaceholder holder) { // <14> log.d(tag,"surfacedestroyed()"); if(this.camera != null){ camera.stoppreview(); camera.lock(); camera.release(); this.camera = null; } } public void releasecamera(){ log.d(tag,"releasecamera()"); if (camera != null) { camera.stoppreview(); camera.setpreviewcallback(null); camera.release(); camera = null; } } } 

the preview initialised (from main activity):

@override protected void onresume() { super.onresume(); log.d(tag,"onresume()"); previewlayout.removeallviews(); preview = new preview(this, this); previewlayout.addview(preview, new viewgroup.layoutparams(viewgroup.layoutparams.match_parent,viewgroup.layoutparams.match_parent)); preview.opencamera(); } 

and manifest:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.mc.ccpro" android:versioncode="35" android:versionname="3.5" > <application android:hardwareaccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:largeheap="true" > <activity android:name=".ccproactivity" android:configchanges="keyboard|orientation|keyboardhidden" android:label="@string/app_name" android:windowsoftinputmode="adjustpan" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> <intent-filter> <action android:name="android.media.action.image_capture" /> <category android:name="android.intent.category.default" /> </intent-filter> </activity> <activity android:name="net.mc.lib.cc.preferenceactivity" android:label="@string/set_preferences" > </activity> </application> <supports-screens android:largescreens="true" android:normalscreens="true" android:smallscreens="true" android:resizeable="true" android:anydensity="true" /> <uses-sdk android:minsdkversion="7" android:targetsdkversion="8" /> <uses-permission android:name="android.permission.access_fine_location" /> <uses-permission android:name="android.permission.camera" /> <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.write_external_storage" /> <uses-permission android:name="android.permission.access_network_state" /> <uses-library android:name="net.mc.lib.cc" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <supports-screens android:largescreens="true" android:normalscreens="true" android:smallscreens="true" android:xlargescreens="true" /> </manifest> 

use code initialize camera:

 camera camera; if (build.version.sdk_int >= build.version_codes.gingerbread) { int numberofcameras = camera.getnumberofcameras(); camerainfo camerainfo = new camerainfo(); (int = 0; < numberofcameras; i++) { camera.getcamerainfo(i, camerainfo); if (camerainfo.facing == camerainfo.camera_facing_back) camera = camera.open(i); } } if (camera == null) camera = camera.open(); ... 

Comments

Popular posts from this blog

javascript - backbone.js Collection.add() doesn't `construct` (`initialize`) an object -

php - Get uncommon values from two or more arrays -

Adding duplicate array rows in Php -