2013-04-12 4 views
0

В моем основном действии с помощью одной кнопки нажмите приведенную ниже активность, чтобы запустить изображение с камерой по умолчанию приложение в android, а затем запись голоса.Невозможно запустить Activity ComponentInfo {com.naviiid.soundshot/com.naviiid.soundshot.MicroFilm}: java.lang.NullPointerException

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

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.naviiid.soundshot/com.naviiid.soundshot.MicroFilm}: 
java.lang.NullPointerException 

Там есть пункт, что запуск приложений камеры, но до того, что мое приложение остановилось! Вот код (извините, что код немного долго):

package com.naviiid.soundshot; 

import java.io.File 
import java.util.Calendar; 
import android.R.drawable; 
import android.app.Activity; 
import android.content.Intent; 
import android.graphics.drawable.Drawable; 
import android.media.MediaRecorder; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MicroFilm extends Activity { 

    private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; 
    private Uri imageUri; 
    public static final int MEDIA_TYPE_IMAGE = 1; 
    public static final int MEDIA_TYPE_VIDEO = 2; 
    private static File mediaStorageDir; 
    private ImageView image; 
    private ImageView record; 
    private ImageView save; 
    private ImageView capture; 
    private boolean visibleButtons = true; 
    private MediaRecorder soundRecorder; 
    private String mediaFilePath; 
    private static Calendar cal; 
    boolean recording = false; 

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

     String mediaState = Environment.getExternalStorageState(); 
     if (!mediaState.equals(Environment.MEDIA_MOUNTED)){ 
      Toast.makeText(MicroFilm.this, "Media unmounted! \n Mount media firts..", Toast.LENGTH_LONG).show(); 
      Log.d("StorageState", "Media Unmounted"); 
      finish(); 
     } 

     mediaStorageDir = new File(Environment 
       .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
       .getAbsolutePath() 
       + "/MicroFilm"); 

     takePicture(); // this method will capture image from camera intent and 
         // returns to main activity if user cancels 

     // View things 
     image = (ImageView) findViewById(R.id.imageViewPicture); 
     record = (ImageView) findViewById(R.id.imageViewMic); 
     save = (ImageView) findViewById(R.id.imageViewSave); 
     capture = (ImageView) findViewById(R.id.imageViewCapture); 

     setBackgroundImage(); // shows taken picture 
     captureSound(); // prepares for recording, recording starts with imageButton click 

    } 

    private void captureSound() { 
     // prepare things to record 
     soundRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     soundRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 
     soundRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     File soundFile = getNewSoundFile(); 
     soundRecorder.setOutputFile(soundFile.getAbsolutePath()); 
     try{ 
      soundRecorder.prepare(); 
     }catch (Exception e) { 
      Log.d("SoundRecorder", "unable to prepare"); 
      Toast.makeText(MicroFilm.this, "Mic in use", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     //listeners 
     soundRecorderListeners(); 

    } 

    private void soundRecorderListeners() { 

     record.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if (recording){ 
        soundRecorder.stop(); 
        soundRecorder.release(); 
        recording = false; 
        record.setBackgroundResource(drawable.ic_btn_speak_now); 
       }else{ 
        soundRecorder.start(); 
        recording = true; 
        record.setBackgroundResource(drawable.presence_audio_busy); 
       } 
      } 
     }); 
    } 

    private File getNewSoundFile() { 
     // Create a media file name 
     String timeStamp; 
     cal = Calendar.getInstance(); 
     timeStamp = "" + cal.get(Calendar.YEAR) + cal.get(Calendar.MONTH) + 1 
       + cal.get(Calendar.DAY_OF_MONTH) + "_" 
       + cal.get(Calendar.HOUR_OF_DAY) + cal.get(Calendar.MINUTE) 
       + cal.get(Calendar.SECOND); 
     mediaFilePath = mediaStorageDir.getAbsolutePath() + "/AUD_" + timeStamp 
       + ".amr"; 
     return new File(mediaFilePath); 
    } 

    private void setBackgroundImage() { 
     // shows taken picture in background 
     image.setImageDrawable(Drawable.createFromPath(imageUri.getPath())); 
     image.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if (visibleButtons) { 
        record.setVisibility(View.INVISIBLE); 
        save.setVisibility(View.INVISIBLE); 
        capture.setVisibility(View.INVISIBLE); 
        visibleButtons = false; 
       } else { 
        record.setVisibility(View.VISIBLE); 
        save.setVisibility(View.VISIBLE); 
        capture.setVisibility(View.VISIBLE); 
        visibleButtons = true; 
       } 
      } 
     }); 
    } 

    private void takePicture() { 
     Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     imageUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to 
     // save the image 
     camera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // set the image file 
     // name 

     // start the image captugetOutputMediaFileUrire Intent 
     startActivityForResult(camera, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

    } 

    /** Create a file Uri for saving an image or video */ 
    private static Uri getOutputMediaFileUri(int type) { 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 

    /** Create a File for saving an image or video */ 
    private static File getOutputMediaFile(int type) { 
     // To be safe, you should check that the SDCard is mounted 
     // using Environment.getExternalStorageState() before doing this. 


     // Environment 
     // .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
     // "MyCameraApp"); 
     // This location works best if you want the created images to be shared 
     // between applications and persist after your app has been uninstalled. 

     // Create the storage directory if it does not exist 
     if (!mediaStorageDir.exists()) { 
      if (!mediaStorageDir.mkdirs()) { 
       Log.d("MicroFilm", "failed to create directory"); 
       return null; 
      } 
     } 

     // Create a media file name 
     String timeStamp; 
     cal = Calendar.getInstance(); 
     timeStamp = "" + cal.get(Calendar.YEAR) + cal.get(Calendar.MONTH) + 1 
       + cal.get(Calendar.DAY_OF_MONTH) + "_" 
       + cal.get(Calendar.HOUR_OF_DAY) + cal.get(Calendar.MINUTE) 
       + cal.get(Calendar.SECOND); 
     File mediaFile; 
     if (type == MEDIA_TYPE_IMAGE) { 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator 
        + "IMG_" + timeStamp + ".jpg"); 
     } else if (type == MEDIA_TYPE_VIDEO) { 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator 
        + "VID_" + timeStamp + ".mp4"); 
     } else { 
      return null; 
     } 

     return mediaFile; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       // Image captured and saved to fileUri specified in the Intent 
       Toast.makeText(MicroFilm.this, "Image saved", Toast.LENGTH_LONG).show(); 
      } else if (resultCode == RESULT_CANCELED) { 
       finish(); 
      } else { 
       // Image capture failed, advise user 
      } 
     } 
    } 

} 

спасибо за вашу помощь :)

+0

Не могли бы вы поместить полную трассировку стека? –

+0

Что такое полная трассировка стека? –

ответ

0

I подумайте, что ваш NullPointerException брошен в методе captureSound().

Перед началом вызова методов на этот объект вам нужно инициализировать значение переменной soundRecorder.

+0

Спасибо за помощь. Задача решена :) –

0

Я хотел бы предложить вам присвоить некоторые начальные значения для всех ваших переменных экземпляра.

NULLPOINTEREXCEPTION происходит, когда вы передаете ссылку на нулевой объект при вызове метода.

Это очень вероятно из-за того, что вы не инициализировали эти переменные.

Например,

private Uri imageUri; 

к чему-то вроде

private Uri imageUri = new Uri(); 

(это только пример, и, возможно, не является правильной инициализации класса Uri для вашего предполагаемого использования)

+0

благодарит за вашу помощь. как вы сказали, проблема была в soundRecorder, которая не была инициализирована. Я не могу дать +, потому что у меня нет минимальной репутации! ;) –

+0

Нет проблем. Просто убедитесь, что вы инициализируете каждую переменную, прежде чем использовать ее! – user25409

0

Просто напишите soundRecorder=new MediaRecorder soundRecorder(); после setContentView(R.layout.activity_micro_film);.

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