0

多くの機能を備えたアプリケーションがありますが、アプリケーションにカメラ機能を追加した後、カメラ ボタンをクリックすると、アプリケーションが予期せず停止しました。
AndroidManifest.xml

   <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.Ibetter.tdm"
        android:versionCode="1"
        android:versionName="1.0" >

        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17"
            />    
        <uses-permission android:name="android.permission.WAKE_LOCK" ></uses-permission>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>  
        <uses-permission android:name="android.permission.INTERNET" />
         <uses-feature android:name="android.hardware.camera" />
         <uses-permission android:name="android.permission.CAMERA"  />
         <uses-feature android:name="android.hardware.camera.autofocus" />

        <application
            android:allowBackup="true"
            android:icon="@drawable/icon"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.Ibetter.tdm.ProjectListActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.Ibetter.tdm.ActivityTab"
                android:label="@string/title_activity_tab_edit" 
                android:parentActivityName="com.Ibetter.tdm.ProjectListActivity">
            </activity>
      <activity
                android:name="com.Ibetter.tdm.ProjectEditActivity"
                android:label="@string/title_activity_project_edit" >
    </activity>
    <activity
        android:name="com.Ibetter.tdm.ReleaseEditActivity"
        android:label="@string/title_activity_release_edit" >
    </activity>
    <activity
        android:name="com.Ibetter.tdm.ReleaseListActivity"
        android:label="@string/title_activity_release_list" >
    </activity>
    <activity
        android:name="com.Ibetter.tdm.TestEditActivity"
        android:label="@string/title_activity_test_edit" >
    </activity>
    <activity
        android:name="com.Ibetter.tdm.TestListActivity"
        android:label="@string/title_activity_test_list" >
    </activity>
     <activity
        android:name="com.Ibetter.tdm.ReqListActivity"
        android:label="@string/title_activity_req_list" >
    </activity>
     <activity
        android:name="com.Ibetter.tdm.ReqEditActivity"
        android:label="@string/title_activity_req_edit" >
    </activity>
          </application>
    </manifest>

これはカメラ機能の Java ファイルです。

   public  class ReqEditActivity extends Activity implements OnCompletionListener {
         private EditText mTitleText;
        private EditText mReqDescText;
        private EditText mReqStepsText;
        private Button mConfirmButton;
        private Long mRowId;
        private ProjectsDbAdapter mDbHelper;
        private String gprojectname ="";
        private String greleasename ="";
        private int modifyFormat; 
        private static final int IMAGE_CAPTURE = 1337;
        private Button startBtn;
        private Uri imageUri;
        private ImageView imageView;
      //private static int RESULT_LOAD_IMAGE = 1;
      private static final int REQUEST_CODE = 1;
        private Bitmap bitmap;
        //private ImageView imageView;
        private static final int SELECT_PICTURE = 1;
        //private String selectedImagePath;
        private ImageButton btnPlay;   
       // Media Player
        private  MediaPlayer mp;
        private String gfilename1 =""; 
       private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp";
        private static final String AUDIO_RECORDER_FILE_EXT_AMR = ".amr";
   private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4";
   private static final String REQAUDIO_RECORDER_FOLDER = "ReqAudioRecorder";       
  private MediaRecorder recorder = null;
public static int  currentFormat = 0;
private int output_formats[] = { MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.OutputFormat.THREE_GPP, MediaRecorder.OutputFormat.AMR_NB};
private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP,  AUDIO_RECORDER_FILE_EXT_AMR };
protected static final int RESULT_SPEECH_DESC = 1;  
protected static final int RESULT_SPEECH_STEPS = 2; 
      private ImageButton btnSpeakdesc;
     private ImageButton btnSpeaksteps;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
      mDbHelper = new ProjectsDbAdapter(this);
    setContentView(R.layout.activity_req_edit);
     mTitleText = (EditText) findViewById(R.id.title);
     mReqDescText = (EditText) findViewById(R.id.body);
     mReqStepsText = (EditText) findViewById(R.id.Steps);
     mConfirmButton = (Button) findViewById(R.id.confirm);
     Bundle extras = getIntent().getExtras();   
    gprojectname = extras.getString("project");
    greleasename = extras.getString("release");
     startBtn = (Button) findViewById(R.id.startBtn);
        startBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    startCamera();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
      //retrieve a reference to the ImageView
        //ImageView picView = (ImageView)findViewById(R.id.picture);
        //Bitmap thePic = null;
        //display the returned cropped image
       // picView.setImageBitmap(thePic);    
    mRowId = savedInstanceState != null ? savedInstanceState.getLong(ProjectsDbAdapter.KEY_ROWID_REQS): null;
   registerButtonListenersAndSetDefaultText();
   //for speech to text and recording purpose           
   setButtonHandlers();
   enableButtons(false);
   btnSpeakdesc = (ImageButton) findViewById(R.id.btnSpeakdesc);     
   btnSpeaksteps = (ImageButton) findViewById(R.id.btnSpeaksteps);  
   // All player buttons
   btnPlay = (ImageButton) findViewById(R.id.btnPlay);                
   // Mediaplayer
   mp = new MediaPlayer();      
   btnSpeakdesc.setOnClickListener(new View.OnClickListener()
   {                
    @Override
       public void onClick(View v) {
           Intent intent = new Intent(
                   RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
           intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");
           try {
               startActivityForResult(intent, RESULT_SPEECH_DESC);
               mReqDescText.setText("");
           } 
           catch (ActivityNotFoundException a) 
           {
               Toast t = Toast.makeText(getApplicationContext(),
                       "Opps! Your device doesn't support Speech to Text",
                       Toast.LENGTH_SHORT);
               t.show();
           }
       }
   });
   btnSpeaksteps.setOnClickListener(new View.OnClickListener()
   {                
    @Override
       public void onClick(View v) {
           Intent intent = new Intent(
                   RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
           intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");
           try {
               startActivityForResult(intent, RESULT_SPEECH_STEPS);
               mReqStepsText.setText("");
           } 
           catch (ActivityNotFoundException a) 
           {
               Toast t = Toast.makeText(getApplicationContext(),
                       "Opps! Your device doesn't support Speech to Text",
                       Toast.LENGTH_SHORT);
               t.show();
           }
       }
   });
   /**
    * Play button click event
    * plays a song and changes button to pause image
    * pauses a song and changes button to play image
    * */
   btnPlay.setOnClickListener(new View.OnClickListener() 
   {
       @Override
       public void onClick(View arg0) 
       {
           // check for already playing
           if(mp.isPlaying()){
               if(mp!=null){
                   mp.pause();
                   // Changing button image to play button
                   btnPlay.setImageResource(R.drawable.btn_play);
               }
           }else{
               // Resume song
               if(mp!=null){
                   mp.start();
                   // Changing button image to pause button
                   btnPlay.setImageResource(R.drawable.btn_pause);
                   // play selected song
                   Cursor filename = mDbHelper.fetchreqsFileName(mRowId);
                   startManagingCursor(filename);
                   gfilename1 = filename.getString(filename.getColumnIndexOrThrow(ProjectsDbAdapter.KEY_REQFILENAME));
                  playSong(gfilename1);
               }
           }
       }
   });
}
    public void startCamera() 
      throws IOException {
  Log.d("QAM_CAMERA", "Starting camera on the phone...");
  File photosDir = new File(Environment.getExternalStorageDirectory(), "photos");
  if (!photosDir.isDirectory()) {
      photosDir.mkdirs();
  }
  File imageFile = File.createTempFile("testphoto", ".jpg", photosDir);
  Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
  intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  startActivityForResult(intent, IMAGE_CAPTURE);
}
     private void setRowIdFromIntent() {
  if (mRowId == null || mRowId.longValue() == 0) {
        Bundle extras = getIntent().getExtras();            
        gprojectname = extras.getString("project");
        greleasename = extras.getString("release");
        mRowId = extras != null ? extras.getLong(ProjectsDbAdapter.KEY_ROWID_REQS) : null;
   }
  }
      @Override
      protected void onPause() {
          super.onPause();
          mDbHelper.close(); 
      }
      @Override
      protected void onResume() {
          super.onResume();
          mDbHelper.open(); 
        setRowIdFromIntent();
    populateFields();
      }
      private void registerButtonListenersAndSetDefaultText() {
          mConfirmButton.setOnClickListener(new View.OnClickListener() {
            @Override
    public void onClick(View view) {
                saveState(); 
                setResult(RESULT_OK);
                Toast.makeText(ReqEditActivity.this, getString(R.string.task_saved_message), Toast.LENGTH_SHORT).show();
                finish(); 
            }
          });
      }
      private void populateFields()  {
  try
   {
      // Only populate the text boxes and change the calendar date
     // if the row is not null from the database. 
        if (mRowId != null) 
     {
               Cursor reqs = mDbHelper.fetchreqs(mRowId);
              startManagingCursor(reqs);
              mTitleText.setText(reqs.getString(
            reqs.getColumnIndexOrThrow(ProjectsDbAdapter.KEY_TITLE)));
      mReqDescText.setText(reqs.getString(
              reqs.getColumnIndexOrThrow(ProjectsDbAdapter.KEY_DESC)));
      mReqStepsText.setText(reqs.getString(
              reqs.getColumnIndexOrThrow(ProjectsDbAdapter.KEY_BODY)));
      reqs.close();
     } else {
            // This is a new task - add defaults from preferences if set. 
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
            String defaultTitleKey = getString(R.string.pref_task_title_key);           
            String defaultTitle = prefs.getString(defaultTitleKey, null);       
          //if(defaultTitle != null)
        mTitleText.setText("Edit REQS"); 
          }
    }
  catch (Exception ex)
    {}
      }
      @Override
      protected void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
          outState.putLong(ProjectsDbAdapter.KEY_ROWID_REQS, mRowId);
      }
      private void saveState() {
          String title = mTitleText.getText().toString();
          String Desc = mReqDescText.getText().toString();
          String Body = mReqStepsText.getText().toString();
          if (mRowId == null || mRowId.longValue() == 0)
          {
            long id = mDbHelper.createreqs(title, Desc, Body,gprojectname,greleasename);
              if (id > 0) {
                  mRowId = id;
              }
          } else {
              mDbHelper.updatereqs(mRowId, title, Desc, Body);
          }
      }
    //for speech to text and audio recording
     public View.OnClickListener btnClick = new View.OnClickListener() 
      {
        @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.btnStart:{
                AppLog.logString("Start Recording");
                enableButtons(true);
                startRecording();
                break;
            }
            case R.id.btnStop:{
                AppLog.logString("Start Recording");
                enableButtons(false);
                stopRecording();
                                    break;
            }
            }
    }
    };
 public MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
    @Override
    public void onError(MediaRecorder mr, int what, int extra) {
        AppLog.logString("Error: " + what + ", " + extra);
    }
};
public MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
    @Override
    public void onInfo(MediaRecorder mr, int what, int extra) {
        AppLog.logString("Warning: " + what + ", " + extra);
    }
};
public void setButtonHandlers() {
    ((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick);
  ((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick);
}
public void enableButton(int id,boolean isEnable){
    ((Button)findViewById(id)).setEnabled(isEnable);
}
public void enableButtons(boolean isRecording) {
    enableButton(R.id.btnStart,!isRecording);           
    enableButton(R.id.btnStop,isRecording);
}
/*private void setStopButtonCaption(){
    ((Button)findViewById(R.id.btnStop)).setText(getString(R.string.audio_format) + " (" + file_exts[currentFormat] + ")");
}*/
@SuppressLint("NewApi")
private void startRecording(){
    //displayFormatDialog();
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String formats[] = {"MPEG 4", "3GPP", "AMR"};
    builder.setTitle(getString(R.string.choose_format_title))
.setSingleChoiceItems(formats, currentFormat, new DialogInterface.OnClickListener()                  {

    @Override
    public void onClick(DialogInterface dialog, int which) {
    currentFormat = which;
    dialog.dismiss();
    recorder = new MediaRecorder();         
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(output_formats[currentFormat]);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(getFilename());          
    //recorder.setOnErrorListener(errorListener);
    //recorder.setOnInfoListener(infoListener);
    try {
        recorder.prepare();
        recorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
   }
  }).show();
}
private void stopRecording(){
    if(null != recorder)
    {
        mDbHelper.updatereqsFileName(mRowId, gfilename1); 
        recorder.stop();
        recorder.reset();
        recorder.release();             
        recorder = null;
        }
   }
  /*private int displayFormatDialog(){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String formats[] = {"MPEG 4", "3GPP", "AMR"};
    builder.setTitle(getString(R.string.choose_format_title))
           .setSingleChoiceItems(formats, currentFormat, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                currentFormat = which;
                dialog.dismiss();
            }
           }).show();
    return currentFormat;
}*/
public String getFilename(){
    String filepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filepath,REQAUDIO_RECORDER_FOLDER);
    if(!file.exists()){
        file.mkdirs();
    }
    gfilename1 = (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]);
    return (gfilename1 );
}
    /**
       * Receiving song index from playlist view
       * and play the song
       * */
      @Override
      protected void onActivityResult(int requestCode,
                               int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
    //conversion and audio record
         switch (requestCode) 
          {
        case RESULT_SPEECH_DESC: {
            if (resultCode == RESULT_OK && null != data) {
                ArrayList<String> text = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                mReqDescText.setText(text.get(0));
            }
            break;
        }
        case RESULT_SPEECH_STEPS: {
            if (resultCode == RESULT_OK && null != data) {
                ArrayList<String> text = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                mReqStepsText.setText(text.get(0));
            }
            break;
        }
  }
    if (requestCode == IMAGE_CAPTURE) {
      if (resultCode == RESULT_OK){
          Log.d("ANDRO_CAMERA","Picture taken!!!");
          imageView.setImageURI(imageUri);
      }
    }
 }
    @Override
public void onCompletion (MediaPlayer arg0) 
{               
}
      /**
       * Function to play a song
       * @param songIndex - index of song
       * */
      public void  playSong(String gfilename1){
          // Play song
             try
             {
              mp.reset();
              mp.setDataSource(gfilename1);
              mp.prepare();
              mp.start();
              // Changing Button Image to pause image
              btnPlay.setImageResource(R.drawable.btn_pause);
           } catch (IllegalArgumentException e) {
              e.printStackTrace();
          } catch (IllegalStateException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
         }
      }  
    @Override
       public void onDestroy(){
       super.onDestroy();
          mp.release();
       }
     public String getPath(Uri uri) {
          String[] projection = { MediaStore.Images.Media.DATA };
         Cursor cursor = managedQuery(uri, projection, null, null, null);
          int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
          cursor.moveToFirst();
          return cursor.getString(column_index);
      }
     }

カメラ機能を追加した後、これらのエラーが表示されます。Java とマニフェスト ファイルを確認できますか?バージョンの問題が背後にありますか?

Logcat エラー

    03-16 04:48:06.826: E/AndroidRuntime(1239): FATAL EXCEPTION: main
    03-16 04:48:06.826: E/AndroidRuntime(1239): java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.LoadedApk.makeApplication(LoadedApk.java:504)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4364)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.ActivityThread.access$1300(ActivityThread.java:141)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.os.Handler.dispatchMessage(Handler.java:99)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.os.Looper.loop(Looper.java:137)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.ActivityThread.main(ActivityThread.java:5039)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at java.lang.reflect.Method.invoke(Method.java:511)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at dalvik.system.NativeStart.main(Native Method)
    03-16 04:48:06.826: E/AndroidRuntime(1239): Caused by: java.lang.NullPointerException
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:379)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.LoadedApk.getClassLoader(LoadedApk.java:322)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     at android.app.LoadedApk.makeApplication(LoadedApk.java:496)
    03-16 04:48:06.826: E/AndroidRuntime(1239):     ... 11 more
4

1 に答える 1

0

パッケージ マネージャーが必要な情報を取得していないようです。ADT/adb/eclipse の既知のバグ。以下を実行して、試してみてください。ほとんどの場合、問題は解決します。

  • プロジェクトのクリーンアップを試みます->デバイス/エミュレーターからアプリをアンインストールします->再実行します。

  • ライブラリを使用している場合は、プロジェクトのプロパティに移動した後、プロジェクトでそのライブラリの参照を提供してみてください。

  • 新しく作成した別のワークスペースで試してください。

それが役立つことを願っています。

于 2013-03-16T05:05:17.757 に答える