2012-01-03 9 views
1

これまでのところ、私のアプリはSDカードに新しいフォルダを作成し、新しいフォルダに画像を保存しています。新しいアクティビティでAndroidディスプレイカメラ画像

私はそれを取得しようとしていますが、写真が撮られたら、「使用」または「再撮影」と言う2つのボタンを使って新しいアクティビティで表示されます。これまで画像の保存は完全にうまくいきましたが、画像が取得されて新しいアクティビティを開こうとすると、カメラのアクティビティにそのまま残り、サーフェスビューを持っているので使用できない画像が表示されます。

私のLogCatで、私が正しい場所から画像を呼び出さないために画像が見つからない場合に表示されるように設定されているエラー "Oh、no reference"が表示されます私のPunch.javaで。

私は一度、画像が新しいアクティビティ "Punch.java"を開き、ちょうど取られた画像を表示するためにアプリを取ったことがあります。今、新たな活動を開きますが、まだできない

intent.putExtra("filepath",uriSavedImage.toString());

UPDATE Lumisのおかげ(以下のコードは更新されている)

変更

intent.putExtra("filepath",uriSavedImage);

画像を参照してください。

UPDATE 2 Punch.java

私は私が"/sdcard/Punch/image_0.jpg"(myRef)を変更した場合、私はその画像を見ることができる、新しいコードのように私のPunch.javaを更新しましたが、私はそれだけだった画像にreferanceする必要がありますこの行には何かがあるカメラで撮影したと思いintent.putExtra("filepath",uriSavedImage.toString());

アップデート3

ほぼ完璧に今働いて使用してintent.putExtra("filepath",Uri.parse(output.getAbsolutePath()).toString());が何らかの理由でまだ起動していますが、何らかの理由で起動時にsdcard/

が正常に動作しています。ここでは、画像を撮っている間にsdcardがコンピュータにマウントされています。私のカメラ活性の

私は

PictureCallback myPictureCallback_JPG = new PictureCallback(){ 

    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 
     /*Bitmap bitmapPicture 
      = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); */ 
     int imageNum = 0; 
     Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Punch"); 
     imagesFolder.mkdirs(); // <---- 
     String fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
     File output = new File(imagesFolder, fileName); 
     while (output.exists()){ 
      imageNum++; 
      fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
      output = new File(imagesFolder, fileName); 
     } 

     Uri uriSavedImage = Uri.fromFile(output); 
     imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 


     OutputStream imageFileOS; 
     try { 
      imageFileOS = getContentResolver().openOutputStream(uriSavedImage); 
      imageFileOS.write(arg0); 
      imageFileOS.flush(); 
      imageFileOS.close(); 

      Toast.makeText(AndroidCamera.this, 
        "Image saved", 
        Toast.LENGTH_LONG).show(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Intent intent = new Intent(getBaseContext(), Punch.class); 
     intent.putExtra("filepath",uriSavedImage.toString()); 
     //just using a request code of zero 
     int request=0; 
     startActivityForResult(intent,request); 
    }}; 

を持っているし、次の活動である私のPunch.javaは次のとおりです。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.punch); 

    String myRef = this.getIntent().getStringExtra("filepath"); 

    File imgFile = new File(myRef); 
    if(imgFile.exists()){ 

     Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

     ImageView myImage = (ImageView) findViewById(R.id.imagepunch); 
     myImage.setImageBitmap(myBitmap); 

    } 

} 

は}

+0

私はmntが正常だと思います。この質問の回答を確認してください:http://stackoverflow.com/questions/7102104/android-how-to-access-a-file -in-the-sd-cardそれはwhaでなければならないtever Environment.getExternalStorageDirectory()returns ... – Lumis

答えて

1

ファイルパスの問題だと思います。ファイルパスをURIとして送信しましたが、ビューアのアクティビティを文字列として読み込んでいます。

おそらく、あなたにこの行を変更するにはニート:

intent.putExtra("filepath",uriSavedImage.toString()); 

それとも

intent.putExtra("filepath",Uri.parse(output.getAbsolutePath()).toString()); 

それがパスをファイルに来るときアンドロイドの異なるバージョンが同じように動作しない場合がありますので、あなたが使用して実験する必要がありますUri.parse(fileStr)またはString ...

+0

私は、新しいアクティビティに移動しますが、まだ画像は表示されません。 – Matt

+0

画像が正しいフォルダ内のSDカードにあるかどうか確認してください。そうであれば、decodeFileで使用しているファイルパスに問題があります。 decodeFileで動作するパスを手動で入力して、そのフォーマットを確認してください。 – Lumis

+0

これをどういう意味なのかわからないのは、(myRef)ではなくPunch.javaの意味ですか? – Matt

0

ちょうどあなたのコードとあなたのアプローチを見て、このシナリオでは、カメラ/画像ライブラリの[共有]オプションの下に表示されるように、新しいコンテンツハンドラが登録されていると思います。この方法では、組み込みのAndroid機能では本質的に冗長性のある使用/取り込みロジックに関与していません。 EvernoteやPicasaのようなアプリを考えてみてください。あなたは写真を撮って(または前に撮った写真を見て)、「共有」を選択します。共有オプションの1つは、Picasa、電子メールなどと一緒にあなたのアプリになります。それが私のやり方です。

+0

私はこれについて考えていましたが、アプリを動作させるためには、画像を一定の方法で取り込んでサーフェス付きのカスタムカメラを使用する必要があります – Matt

関連する問題