2017-10-05 67 views
0

我是android开发的新手。我正在制作一个简单的应用程序来打开sufaceView中的相机。我想工作的这个应用程序从Android API级别16.我已经写了一些代码,API等级22模拟器,它的工作原理,但不是在API级别16仿真器(当我点击开始按钮,应用程序崩溃)此android应用程序在API 22模拟器中工作,但在API 16模拟器中

VideoServer.java

package com.example.admin2.cameraonsurfaceview; 


import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class VideoServer extends Activity implements SurfaceHolder.Callback { 
    TextView testView; 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 

    private final String tag = "VideoServer"; 

    Button start, stop; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     start = (Button)findViewById(R.id.btn_start); 
     start.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View arg0) { 
       start_camera(); 
      } 
     }); 

     stop = (Button)findViewById(R.id.btn_stop); 
     stop.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View arg0) { 
       stop_camera(); 
      } 
     }); 

     surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     Toast.makeText(this, "Need your location!", Toast.LENGTH_SHORT).show(); 



    } 

    private void start_camera() { 
     try{ 
      camera = Camera.open(); 
     }catch(RuntimeException e){ 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
     Camera.Parameters param; 
     param = camera.getParameters(); 
     //modify parameter 
     param.setPreviewFrameRate(20); 
     param.setPreviewSize(176, 144); 
     camera.setParameters(param); 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
     } catch (Exception e) { 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
    } 

    private void stop_camera() { 
     camera.stopPreview(); 
     camera.release(); 
    } 

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 
} 

和布局文件的样子

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.admin2.cameraonsurfaceview.MainActivity"> 

    <SurfaceView 
     android:id="@+id/surfaceView1" 
     android:layout_width="201dp" 
     android:layout_height="230dp" 
     tools:layout_constraintTop_creator="1" 
     tools:layout_constraintRight_creator="1" 
     android:layout_marginStart="52dp" 
     android:layout_marginEnd="52dp" 
     app:layout_constraintRight_toRightOf="parent" 
     android:layout_marginTop="25dp" 
     tools:layout_constraintLeft_creator="1" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     android:layout_marginLeft="52dp" 
     android:layout_marginRight="52dp" 
     app:layout_constraintHorizontal_bias="0.0" 
     app:layout_constraintBottom_toBottomOf="parent" 
     android:layout_marginBottom="8dp" 
     app:layout_constraintVertical_bias="0.0" /> 

    <Button 
     android:id="@+id/btn_start" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Start" 
     android:layout_marginTop="27dp" 
     app:layout_constraintTop_toBottomOf="@+id/surfaceView1" 
     android:layout_marginLeft="52dp" 
     app:layout_constraintLeft_toLeftOf="parent" 
     android:layout_marginStart="52dp" /> 

    <Button 
     android:id="@+id/btn_stop" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Stop" 
     tools:layout_constraintRight_creator="1" 
     tools:layout_constraintBottom_creator="1" 
     app:layout_constraintBottom_toBottomOf="parent" 
     android:layout_marginEnd="52dp" 
     app:layout_constraintRight_toRightOf="parent" 
     android:layout_marginBottom="16dp" 
     android:layout_marginRight="131dp" 
     android:layout_marginTop="8dp" 
     app:layout_constraintTop_toBottomOf="@+id/surfaceView1" 
     app:layout_constraintVertical_bias="0.157" /> 
</android.support.constraint.ConstraintLayout> 

我的Android清单看起来像

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.admin2.cameraonsurfaceview"> 

    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="22" /> 

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".VideoServer"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

当我点击开始按钮,程序停止,我得到下面的异常

10-05 15:39:48.174 2335-2335/com.example.admin2.cameraonsurfaceview E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at com.example.admin2.cameraonsurfaceview.VideoServer.start_camera(VideoServer.java:61) 
    at com.example.admin2.cameraonsurfaceview.VideoServer.access$000(VideoServer.java:14) 
    at com.example.admin2.cameraonsurfaceview.VideoServer$1.onClick(VideoServer.java:34) 
    at android.view.View.performClick(View.java:4084) 
    at android.view.View$PerformClick.run(View.java:16966) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4745) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 
+1

它是如何“不起作用”?您是否收到错误消息,或者应用程序的行为与您的期望不符?请在您的问题中包含这些详细信息。 – Haem

+0

当我点击开始按钮,应用程序崩溃 – Joyal

+0

这是因为我没有扩展AppCompatActivity? – Joyal

回答

0

最后我自己修复了这个问题。 以下代码行导致空指针异常

camera = Camera.open();

余改变为

相机= Camera.open(1);

然后它工作。

0

删除<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="22" />从你的清单。

然后检查您的版本到build.gradle。示例:

android { defaultConfig { minSdkVersion 16 // here you need to change into 16 if you already didn't targetSdkVersion 25 . . 为了使用API​​ 16,您需要将minSdkVersion设置为16。然后重新同步gradle并解决可能出现的代码与16版本不兼容的问题。

+0

它已经是这样了。我添加了我点击相机开始按钮时获得的日志,请帮助,感谢您的回复 – Joyal

+0

使用调试并查看“start_camera”方法中的空白,看看发生了什么。 –

相关问题