2016-04-04 15 views
1

私は写真を撮って内部の記憶装置に保存し、後でそれを取り出すことができるアプリを持っています(恐らくそのウリ)。これは私がこれまで持っているものです: このコードは、私のカスタムカメラボタンが押されたときにトリガされます。画像を撮って保存してもらうことができます+

cameraButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final Intent takePic = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      File file = herp(MEDIA_TYPE_IMAGE); 
      if (file != null) { 
       fileUri = getOutputMediaFileUri(file); 
       Log.d("AddRecipeActivity", fileUri.toString()); 
       takePic.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
       startActivityForResult(takePic, CAMERA_REQUEST); 
      } 
     } 
    }); 

次に、私は(主にAndroidの開発者サイトから取られた)コードの後の2つのメソッドを定義しました:

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

/** Create a File for saving an image or video */ 
public File herp(int type){ 
    // To be safe, you should check that the SDCard is mounted 
    // using Environment.getExternalStorageState() before doing this. 
    Boolean a = false; 
    String externalDirectory= getFilesDir().getAbsolutePath(); 
    File folder= new File(externalDirectory + "/NewFolder"); 


    // 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 (!folder.exists()){ 
     a = folder.mkdirs(); 
     Log.d("AddRecipeActivity", String.valueOf(a)); 
     } 




    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE){ 
     mediaFile = new File(folder.getPath() + File.separator + 
       "IMG_"+ timeStamp + ".jpg"); 
    } else { 
     return null; 
    } 
    if(mediaFile == null){ 
     Log.d("AddRecipeActivity", "Media file is null"); 
    } 
    return mediaFile; 
} 

私は(右の意図をトリガする前に)私のウリを印刷するときI次の出力を取得します。

04-04 04:22:40.757 22402-22402/scissorkick.com.project2 D/AddRecipeActivity: file:///data/user/0/scissorkick.com.project2/files/NewFolder/IMG_20160404_042240.jpg 

また、ディレクトリが作成されているかどうかを確認すると、ブール値がtrueになります。 カメラインテントのonActivityResultを実行すると、結果コードは0になります。

なぜこの時点で失敗するのですか?私はマニフェストに適切なパーミッションを定義し、実行時に外部ストレージの書き込みパーミッションも要求します。

編集:onActivityResultを追加しました:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    if(requestCode == CAMERA_REQUEST){ 
     Log.d("AddRecipe", String.valueOf(resultCode)); 
     if(resultCode == RESULT_OK){ 
      photo = (Bitmap) data.getExtras().get("data"); 
      thumb = ThumbnailUtils.extractThumbnail(photo, 240, 240); 
      photoView.setImageBitmap(thumb); 
      //Toast.makeText(getApplicationContext(), "image saved to:\n" + data.getData(), Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      Toast.makeText(getApplicationContext(), "Fail", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

はonActivityResultでいくつかのナンセンスコードありますが、ポイントはのresultCode = 0と私はなぜ知らないということです。最終的な活動で

+0

あなたのonActivityResultコードを表示 – Karthik

+0

が追加されました。私はそれが適切に配線されていると思うが、私は100%ではない – user2805004

+0

あなたはあなたの問題を解決しましたか? – Dario

答えて

0

、以下のコード

data.putExtra("uri", uri);//uri = your image uri 
    getActivity().setResult(""result_code", data); 
    getActivity().finish(); 

を置く次に、あなたのonActivityResultコードであなたは

Uri uri = data.getExtras().getParcelable("uri"); 

のようなURIはその後、あなたのイメージを取得するために、このURI値を使用することができます得ることができます。

1

私のアプリで写真を撮る方法はありますか?

私は私自身の画像ボタンを押す

static final int REQUEST_IMAGE_CAPTURE = 1; 
static final int REQUEST_TAKE_PHOTO = 1 
static final String STATE_PHOTO_PATH = "photoPath"; 

ImageButton photoButton = (ImageButton) this.findViewById(R.id.take_picture_button); 
     photoButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       dispatchTakePictureIntent(); 
      } 
     }); 

そして、ここでどのようにiだけで、DBにレコードを保存ActivityResultで画像

private File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "JPEG_" + timeStamp + "_"; 
     File storageDir = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile(
       imageFileName, /* prefix */ 
       ".jpg",   /* suffix */ 
       storageDir  /* directory */ 
     ); 

     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
     return image; 
    } 

    //Create a new empty file for the photo, and with intent call the camera 
    private void dispatchTakePictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // Ensure that there's a camera activity to handle the intent 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException e) { 
       // Error occurred while creating the File 
       Log.e("Error creating File", String.valueOf(e.getMessage())); 
      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
         Uri.fromFile(photoFile)); 
       //I have the file so now call the Camera 
       startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
      } 
     } 
    } 

    private void openImageReader(String imagePath) { 
     Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_VIEW); 
     Uri imgUri = Uri.parse(imagePath); 
     intent.setDataAndType(imgUri, "image/*"); 
     startActivity(intent); 

    } 

でファイルを保存/管理し、作成私はそれを元に戻して、ファイルのように格納された写真を読むことができるように画像のパス。あなたには、いくつかの画面の回転を持っている場合は

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 

      //Save the path of image in the DB 
      db.addCompito(new Compiti(activity_name, null, mCurrentPhotoPath)); 
      refreshListView(); 
     } 
    } 

@Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     // Save the user's current game state 
     savedInstanceState.putString(STATE_PHOTO_PATH, mCurrentPhotoPath); 

     // Always call the superclass so it can save the view hierarchy state 
     super.onSaveInstanceState(savedInstanceState); 
    } 


    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     // Always call the superclass so it can restore the view hierarchy 
     super.onRestoreInstanceState(savedInstanceState); 

     // Restore state members from saved instance 
     mCurrentPhotoPath = savedInstanceState.getString(STATE_PHOTO_PATH); 
    } 

WHY

のようなものを追加することを忘れないでください?

ローテーションが変更されたときに、「新しい写真」用に作成したファイルが失われて受け入れて保存すると、フォトパスは無効になり、画像は作成されません。

関連する問題