2014-02-02 4 views
0

У меня есть простое одноклассное приложение, которое должно включать свет камеры, но это мой журнал ошибок;Я не могу заставить камеру включить свет

02-02 12:40:47.939: W/dalvikvm(24314): threadid=1: thread exiting with uncaught exception (group=0x4178d898) 
02-02 12:40:47.949: E/AndroidRuntime(24314): FATAL EXCEPTION: main 
02-02 12:40:47.949: E/AndroidRuntime(24314): java.lang.NullPointerException 
02-02 12:40:47.949: E/AndroidRuntime(24314): at de.vogella.android.notificationmanager.NotificationReceiverActivity.onClick(NotificationReceiverActivity.java:53) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at android.view.View.performClick(View.java:4475) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at android.view.View$PerformClick.run(View.java:18784) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at android.os.Handler.handleCallback(Handler.java:730) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at android.os.Looper.loop(Looper.java:137) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at android.app.ActivityThread.main(ActivityThread.java:5414) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at java.lang.reflect.Method.invokeNative(Native Method) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at java.lang.reflect.Method.invoke(Method.java:525) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
02-02 12:40:47.949: E/AndroidRuntime(24314): at dalvik.system.NativeStart.main(Native Method) 

И вот мой класс;

import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.app.Activity; 
import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.ImageButton; 

public class NotificationReceiverActivity extends Activity implements OnClickListener { 
    private final String CLASSNAME = getClass().getSimpleName(); 
    boolean camOn = false; 
    public boolean started; 

Camera cam = null; 
ImageButton ib1; 
Parameters para; 
PowerManager pm; 
WakeLock wl; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
started = true; 
requestWindowFeature(Window.FEATURE_NO_TITLE); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "whatever"); 
super.onCreate(savedInstanceState); 
setContentView(R.layout.result); 

wl.acquire(); 
initialize(); 
ib1.setOnClickListener(this); 
Log.i(CLASSNAME, "CREATING NOW "+camOn); 
} 

private void initialize() { 
// TODO Auto-generated method stub 
ib1 = (ImageButton) findViewById(R.id.ib2); 
} 

public void onClick(View v) { 

// TODO Auto-generated method stub 
if (camOn == false) { 
     cam.release(); 

    cam = Camera.open(); 
    para = cam.getParameters(); 
    para.setFlashMode(Parameters.FLASH_MODE_TORCH); 
    cam.setParameters(para); 
    Log.i(CLASSNAME, "AA1 "+camOn); 
    camOn = true; 
    Log.i(CLASSNAME, "AA2 "+camOn); 

} 



else { 
    para.setFlashMode(Parameters.FLASH_MODE_OFF); 
    cam.setParameters(para); 
    cam.release(); 
    //cam = null; 
    Log.i(CLASSNAME, "BB1 "+camOn); 
    camOn = false; 
    Log.i(CLASSNAME, "BB2 "+camOn); 

} 
} 

@Override 
protected void onPause() { 
super.onPause(); 
// TODO Auto-generated method stub 
cam.release(); 
// cam=cam; 
// finish();*/ 
} 
@Override 
protected void onStop() { 
super.onStop(); 
// cam.release(); 

} 
@Override 
protected void onDestroy() { 
super.onDestroy(); 
// cam.release(); 

} 
protected void onResume() { 
super.onResume(); 
//cam = Camera.open(); 
} 

} 

Если я запускаю этот же точный код на андроид 4.1.2, он работает безупречно, но на мой андроид Galaxy Note3, который 4,3, она показывает графический интерфейс и при нажатии на кнопку для переключения камеры свет вкл/выкл он ничего не делает и дает мне лог-кошку, как вы видели.

Это файл макета;

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/RelativeLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".Flash" > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="147dp" 
     android:layout_marginBottom="15dip" 
     android:gravity="center" 
     android:padding="15dip" 
     android:text="\n\n\n\n\n" 
     android:textColor="#3b3b3b" 
     android:textSize="13dip" /> 

    <ImageButton 
     android:id="@+id/ib2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     android:layout_marginBottom="15dip" 
     android:gravity="center" 
     android:padding="15dip" 
     android:text="\n" 
     android:textColor="#3b3b3b" 
     android:textSize="13dip" /> 

</LinearLayout> 

ответ

1

Несколько вещей, которые я заметил.

Во-первых, когда camOn == false у вас есть cam.release(), хотя cam=Null в этой точке. Если мне что-то не хватает, все в порядке.

Во-вторых, вам действительно нужен элемент surfaceView для использования камеры. Некоторые устройства в порядке без этого, но это часть системы Android, как подробно here.

Например, после добавления SurfaceView в макет, вы могли бы сделать

msurfaceView = (SurfaceView)findViewById(R.id.surfaceView); 
msurfaceHolder = surfaceView.getHolder(); 
msurfaceHolder.addCallback(this); 
msurfaceHolder.setFixedSize(1, 1); 

и после установки параметров для камеры с setParameters, вызовите

mCamera.setPreviewDisplay(mSurfaceHolder); 
mCamera.startPreview(); 

Это был вопрос на одном моих телефонов, и используя поверхностное представление, это разрешено. Я предполагаю, что вы отредактировали файл манифеста, чтобы включить правильные разрешения.

+0

Вы спасатель жизни! Я просто добавил свой файл макета, вы можете показать мне, как его реализовать? Плюс я должен расширить класс до SurfaceView? Я уже чувствую так много ошибок. –

+0

Я понял, это помогло мне, благодаря миллионам! –

+0

Отлично, рад помочь. – Lazarus

Смежные вопросы