2017-09-10 8 views
1

私の断片にカメラアプリを使用しています。すべてがうまく動作し、撮影された画像は私が望む場所で保存されます。カメラアプリは、戻るボタンを押したときに空のファイルを保存します。

問題は、私が写真アプリにいて、デバイスの戻るボタンを押すと、空のイメージが保存されることです。どうすればそれを避けることができますか?ここで

CameraActivity次のとおりです。助けを

public class CameraActivity extends Activity { 
    private static final String TAG = "CameraActivity"; 
    String currentFilePath; 
    String currentFileName; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     new CameraTask().execute(); 
    } 

    public void dispatchPictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 

      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException e) { 
       Toast.makeText(this, R.string.msg_picture_not_saved, Toast.LENGTH_LONG).show(); 
      } 
      if (photoFile != null) { 
       Uri photoUri = FileProvider.getUriForFile(this, getClass().getCanonicalName(), photoFile); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 
       startActivityForResult(takePictureIntent, Constants.REQUEST_TO_TAKE_PICTURE); 

       addPictureToGallery(); 
       dispatchDataIntent(); 
      } 
     } 
    } 

    public File createImageFile() throws IOException { 
     File pathOfStorageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/Camera"); 
     pathOfStorageDir.mkdir(); 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String filePrefix = "img_" + timeStamp + "_"; 
     String suffix = ".jpg"; 

     File image = File.createTempFile(filePrefix, suffix, pathOfStorageDir); 
     currentFileName = image.getName(); 
     currentFilePath = image.getAbsolutePath(); 
     return image; 
    } 

    private void addPictureToGallery() { 
     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     File f = new File(currentFilePath); 
     Uri contentUri = Uri.fromFile(f); 
     mediaScanIntent.setData(contentUri); 
     this.sendBroadcast(mediaScanIntent); 
    } 

    private void dispatchDataIntent() { 
     Intent data = new Intent(); 
     data.putExtra(Constants.IMAGE_FILE_NAME, currentFileName); 
     setResult(CameraActivity.RESULT_OK, data); 
    } 

    private class CameraTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      dispatchPictureIntent(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      finish(); 
     } 
    } 
} 

ありがとう!

答えて

1

あなたのコードは常に画像ファイルを保存します。ユーザーが戻るボタンを押すと、保存された画像を削除しようとします。より良い方法は、チェック結果コードの後に​​画像をonActivityResultに保存することです。

public class CameraActivity extends Activity { 
    private static final String TAG = "CameraActivity"; 
    String currentFilePath; 
    String currentFileName; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     new CameraTask().execute(); 
    } 

    public void dispatchPictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 

      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException e) { 
       Toast.makeText(this, R.string.msg_picture_not_saved, Toast.LENGTH_LONG).show(); 
      } 
      if (photoFile != null) { 
       Uri photoUri = FileProvider.getUriForFile(this, getClass().getCanonicalName(), photoFile); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 
       startActivityForResult(takePictureIntent, Constants.REQUEST_TO_TAKE_PICTURE); 

      } 
     } 
    } 

    public File createImageFile() throws IOException { 
     File pathOfStorageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/Camera"); 
     pathOfStorageDir.mkdir(); 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String filePrefix = "img_" + timeStamp + "_"; 
     String suffix = ".jpg"; 

     File image = File.createTempFile(filePrefix, suffix, pathOfStorageDir); 
     currentFileName = image.getName(); 
     currentFilePath = image.getAbsolutePath(); 
     return image; 
    } 

    private void addPictureToGallery() { 
     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     File f = new File(currentFilePath); 
     Uri contentUri = Uri.fromFile(f); 
     mediaScanIntent.setData(contentUri); 
     this.sendBroadcast(mediaScanIntent); 
    } 

    private void dispatchDataIntent() { 
     Intent data = new Intent(); 
     data.putExtra(Constants.IMAGE_FILE_NAME, currentFileName); 
     setResult(CameraActivity.RESULT_OK, data); 
    } 

    private class CameraTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      dispatchPictureIntent(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
     } 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == Constants.REQUEST_TO_TAKE_PICTURE){ 
      if(resultCode == RESULT_OK) { 

       addPictureToGallery(); 
       dispatchDataIntent(); 
      } else { 
       File f = new File(currentFilePath); 
       f.delete(); 
      } 
     } 
      finish(); 

    } 
+0

答えを編集していただきありがとうございます。その間、私は自分のAsyncThreadのonPostExecute()で 'finish()'を呼び出しています。だから、 'onActivityResult()'に決して達しませんでした。 'finish()'をどこで呼びますか? –

+1

あなたはfinish()を呼び出すことができます。 onActivityResultで、前にonPostExecuteで finish()を見たことがありません。私のコードを再度更新します。 –

+0

私に正しい方法を教えてくれてありがとう! –