2011-01-18 15 views
4

ネイティブのアンドロイドカメラを起動して、指定した場所に画像を保存します。問題は、写真をクリックすると、プレビューにSave/Discardオプションが表示されます。保存をクリックすると、カメラが再び起動し、キャプチャした画像は指定された場所に保存されません。むしろ、デフォルトの場所に保存されます。実際にクリックした画像の場所が必要です。カメラを起動するコードは次のとおりです。ネイティブカメラを使用してAndroidで画像を保存する

MediaScannerConnection_MSC = null; 
String fileName = String.valueOf(System.currentTimeMillis())+".jpg"; 
f = new File(Environment.getExternalStorageDirectory(), fileName); 
_imageUri = Uri.fromFile(f); 
// create new Intent 
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri); 
startActivityForResult(intent, 1); 

ここで、私はこの1つのためのハイとローの検索した、

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1) { 
      if (resultCode == RESULT_OK) { 
       // use imageUri here to access the image 

       final String imagePath = f.getAbsolutePath(); 
       _MSC = new MediaScannerConnection(this, new MediaScannerConnectionClient() { 

        public void onMediaScannerConnected() { 
         _MSC.scanFile(imagePath, null); 
        } 

        public void onScanCompleted(String path, Uri uri) { 
         _MSC.disconnect(); 
         _MSC = null; 
        } 

       }); 
       _MSC.connect(); 

      } 
     } 
    } 

私はここに私は私はあなたの答えを持っていると思う

+0

、私は非常によく似た質問があります::-)

[OK]を、ここで私が使用して私のFILEIOクラスは、私が最初にこれが含まれていませんでした申し訳ありませんのです。誰もこれに答えることができますか? –

答えて

2

を何のミスをしていたカメラから復帰したコードですそれはややこしい。

まず第一に、私は特定の携帯電話に考えて、

intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri); 

だからあなたのための私の最高の答えがある

:-(無視され、代わりに、「EXTRA_OUTPUT」フラグを設定していません。使用、そこから、それが正常に実行して、新しい画像URIを返してみましょう:

Uri u = intent.getData(); 

そこから、あなたの新しい画像の情報を取得するために、私は新しいlocatiにイメージファイルを書き込むためのFileOutputStreamを使用私はそれを持っていたい。最後に、元のファイルを削除します。 :-)

私はそれが奇妙なことを知っていますが、それは動作し、かなり信頼できると思います。 :-)

私は役立つことを望みます。 :-) J @llango

-Jared

8-28-11

だけでなく、ここにあなたがいる場合コピーして貼り付け、見て歓迎している、全体のコードですが、[OK]をあなたはそれが手始めに

:-)仕事を得ることができ、あなたはこのようにカメラを呼び出すことになるでしょう:

startActivityForResult(CameraIntent, TAKE_PICTURE); 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (resultCode == Activity.RESULT_OK) { 
     switch (requestCode) { 
     case TAKE_PICTURE: 
      Uri u = intent.getData(); 
      //Toast.makeText(getApplicationContext(), u.getPath(), Toast.LENGTH_SHORT).show(); 
      WriteFiles(u); 
      break; 

     } 
    } 
} 

をし、メインの魔法は、この関数の中で起こる:その後、結果のためにあなたはこれをお勧めします、私はそれはあなたが使用して保存するために必要なすべての部品だと思う

private void WriteFiles(Uri myNewPic) { 
    String TempFilePath; 
    String TempPath; 

    File directory = new File("/sdcard/" + getString(R.string.app_name)); 

    if (!directory.exists()) { 
     directory.mkdirs(); 
    } 

    String TempPictureFile; 
    try { 
     TempPictureFile = myNewPic.getLastPathSegment() + ".jpg"; 
     TempFilePath = directory.getPath() + "/" + TempPictureFile; 
     FileOutputStream myOutStream = new FileOutputStream(TempFilePath); 
     InputStream myInStream = getContentResolver().openInputStream(myNewPic); 
     FileIO myFileIO = new FileIO(); 
     myFileIO.copy(myInStream, myOutStream); 
     //now delete the file after copying 
     getContentResolver().delete(myNewPic, null, null); 
     TempFilePaths.add(TempFilePath); 
    } catch (Exception e) { 
     Toast.makeText(getApplicationContext(), getString(R.string.ErrorOpeningFileOutput), Toast.LENGTH_SHORT).show(); 
    } 
} 

ネイティブカメラアプリ。しかし、私はあなたに注意を払う必要があるので、私はこのコードを放棄してしまいました。これは、これ以上の柔軟性と信頼性が必要だったからです(私はあなたが数多くの携帯電話でこのアプリを使用すると思っています。たとえば、サムスンがUIをカスタマイズした結果、私はたくさんの問題を抱えていました。そのため、すべての携帯電話だけでなく、サムスンのものでもうまくいきます。だから私はちょうど私自身のカメラアプリを作り上げてしまったが、あなたのアプリケーションに応じて、これはあなたにとってうまくいくかもしれないと確信している。いずれにせよ....幸運!

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.util.Log; 

public class FileIO { 
private static final int BUFFER_SIZE = 1024 * 2; 

public FileIO() { 
    // Utility class. 
} 

public int copy(InputStream input, OutputStream output) throws Exception, IOException { 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE); 
    BufferedOutputStream out = new BufferedOutputStream(output, BUFFER_SIZE); 
    int count = 0, n = 0; 
    try { 
     while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) { 
      out.write(buffer, 0, n); 
      count += n; 
     } 
     out.flush(); 
    } finally { 
     try { 
      out.close(); 
     } catch (IOException e) { 
      Log.e(e.getMessage(), null); 
     } 
     try { 
      in.close(); 
     } catch (IOException e) { 
      Log.e(e.getMessage(), null); 
     } 
    } 
    return count; 
} 

} 
+0

私はそれを試してみる方法を見てみましょう – pankajagarwal

+0

私は試してみましたが、動作していません。 –

+0

@llango J、私はあなたのアプリにコピーして貼り付けることができるように、コードを改訂して拡張しました。それがあなたのためにそれを修正しない場合はお知らせください。 :-) – Jared

関連する問題