2016-01-20 31 views
0

我做的,是工作就好了一天,一個簡單的攝像頭應用程序。現在我今天再試一次,我一直在文件上得到一個空指針。我在代碼中使用斷點來查看錯誤。製作一個簡單的攝像頭應用程序

filefotoFile = maakFotoBestand(); 

public File maakFotoBestand() throws IOException 
{ 
    //maak een unieke filename aan aan de hand van een timestamp en zet de file storage klaar 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format (new Date()); 
    String imgFileName = "IMAGE_" + timeStamp + "_"; 
    File storageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 

    //sla de foto op in het geheugen aan de hand van de genoemde namen 
    File image = File.createTempFile(imgFileName, ".JPG", storageDirectory); 

    //Zeg de app waar de foto staat 
    imageFileLocation = image.getAbsolutePath(); 

    return image; 
} 

他似乎停止在該行的文件圖像= File.create .........

他已經返回該行。如果我看看圖像的內容,它是空的我做錯了什麼?

編輯============================================= ====== 下面是完整的代碼和logcat的

package nl.compict.cameraapp; 

import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.Toast; 

import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainActivity extends AppCompatActivity implements  View.OnClickListener 
{ 

private static final int ACTIVITY_START_CAMERA_APP = 1; 
private ImageView mFotoCapturedImageView; 
private String imageFileLocation; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mFotoCapturedImageView = (ImageView) findViewById(R.id.imageView01); 
} 


@Override 
public void onClick(View v) 
{ 
    Intent callCameraApplicationIntent = new Intent(); 

    //Roep de Android Camera App aan met de actie om een foto te maken 
    callCameraApplicationIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 

    // 
    File fotoFile = null; 
    try 
    { 
     fotoFile = maakFotoBestand(); 
    } 
    catch(IOException e) 
    { 
     //geef de error weer als die plaatsvind 
     e.printStackTrace(); 
    } 
    //roep de CameraApp nog een keer aan en onthoud het bestand dat is aangemaakt 
    callCameraApplicationIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(fotoFile)); 

    //Start een activity met een request code zodat je die wee kan afvangen en wacht op een resultaat 
    startActivityForResult(callCameraApplicationIntent, ACTIVITY_START_CAMERA_APP); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    //Kijk of de request en resultcode overeenkomen met wat wij willen doen 
    if(requestCode == ACTIVITY_START_CAMERA_APP && resultCode == RESULT_OK) 
    { 
     //Haal de foto op aan de hand van de imageFileLocation 
     Bitmap fotoCaptureBitmap = BitmapFactory.decodeFile(imageFileLocation); 
     mFotoCapturedImageView.setImageBitmap(fotoCaptureBitmap); 
    } 
} 

public File maakFotoBestand() throws IOException 
{ 
    //maak een unieke filename aan aan de hand van een timestamp en zet de file storage klaar 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format (new Date()); 
    String imgFileName = "IMAGE_" + timeStamp + "_"; 
    File storageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 

    //sla de foto op in het geheugen aan de hand van de genoemde namen 
    File image = File.createTempFile(imgFileName, ".JPG", storageDirectory); 

    //Zeg de app waar de foto staat 
    imageFileLocation = image.getAbsolutePath(); 

    return image; 
} 
} 

logcat的

01-20 10:50:24.749 2398-2398/nl.compict.cameraapp E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: nl.compict.cameraapp, PID: 2398 
                   java.lang.IllegalStateException: Could not execute method for android:onClick 
                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275) 
                    at android.view.View.performClick(View.java:5198) 
                    at android.view.View$PerformClick.run(View.java:21147) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:148) 
                    at android.app.ActivityThread.main(ActivityThread.java:5417) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                   Caused by: java.lang.reflect.InvocationTargetException 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
                    at android.view.View.performClick(View.java:5198)  
                    at android.view.View$PerformClick.run(View.java:21147)  
                    at android.os.Handler.handleCallback(Handler.java:739)  
                    at android.os.Handler.dispatchMessage(Handler.java:95)  
                    at android.os.Looper.loop(Looper.java:148)  
                    at android.app.ActivityThread.main(ActivityThread.java:5417)  
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
                   Caused by: java.lang.NullPointerException: file 
                    at android.net.Uri.fromFile(Uri.java:452) 
                    at nl.compict.cameraapp.MainActivity.onClick(MainActivity.java:58) 
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)  
                    at android.view.View.performClick(View.java:5198)  
                    at android.view.View$PerformClick.run(View.java:21147)  
                    at android.os.Handler.handleCallback(Handler.java:739)  
                    at android.os.Handler.dispatchMessage(Handler.java:95)  
                    at android.os.Looper.loop(Looper.java:148)  
                    at android.app.ActivityThread.main(ActivityThread.java:5417)  
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
+0

份額完整的日誌貓 –

回答

1

我測試你的代碼,它完美的作品,你只需要添加您的清單裏面的權限:

<manifest ...> 
    <uses-permission android:name="android.permission.CAMERA"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
</manifest> 

但我不得不添加一個按鈕來觸發捕捉,像這樣:

內佈局:

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Take" 
     android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="59dp" /> 

你的類中:

... 
buttonTakePicture = (Button) findViewById(R.id.button); 
buttonTakePicture.setOnClickListener(this); 
... 
@Override 
    public void onClick(View v) 
    { 
     if(v == buttonTakePicture) { 
      Intent callCameraApplicationIntent = new Intent(); 

      //Roep de Android Camera App aan met de actie om een foto te maken 
      callCameraApplicationIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 

      // 
      File fotoFile = null; 
      try { 
       fotoFile = maakFotoBestand(); 
      } catch (IOException e) { 
       //geef de error weer als die plaatsvind 
       e.printStackTrace(); 
      } 
      //roep de CameraApp nog een keer aan en onthoud het bestand dat is aangemaakt 
      callCameraApplicationIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(fotoFile)); 

      //Start een activity met een request code zodat je die wee kan afvangen en wacht op een resultaat 
      startActivityForResult(callCameraApplicationIntent, ACTIVITY_START_CAMERA_APP); 
     } 
    } 
+0

愚蠢的,攝像頭權限不見了,必須accidentily刪除。 thnx:D – Zeepblok

1

檢查是否已提供給您的應用程序的外部存儲。其他可能性最小的是您的應用程序沒有權限訪問外部存儲。爲了權限和存儲可用性放置一些檢查塊。

相關問題