2016-04-10 14 views
0

私は今Androidでプログラミングを学習しています。このチュートリアルでカメラで写真を撮るためのアプリを作っています。onActivityResultは、バックボタンを押した後にのみ呼び出されます。

http://developer.android.com/training/camera/photobasics.html

しかし、onActivityは、私は私のデバイスで写真を撮った後、[戻る]ボタンを押すと自動に、それが唯一呼ばれて呼び出されません。

package com.olchowski.valentin.cam2dial; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.ActivityInfo; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Toast; 

import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainActivity extends Activity { 

    static final int REQUEST_IMAGE_CAPTURE = 1; 
    String mCurrentPhotoPath; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    setContentView(R.layout.activity_main); 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 


    if (intent.resolveActivity(getPackageManager()) != null) { 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      Toast.makeText(this, "Exception", Toast.LENGTH_SHORT).show(); 
     } 

     if (photoFile != null) { 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
      startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); 
     } else { 
      Toast.makeText(this, "Exception", Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Toast.makeText(this, "RENDERING", Toast.LENGTH_SHORT).show(); 
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     Toast.makeText(this, "PHOTO TAKEN", Toast.LENGTH_SHORT).show(); 
     finish(); 
    } 
} 

private File createImageFile() throws IOException { 
    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,".jpg", storageDir); 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 
} 
+0

カメラアプリで[戻る]ボタンを押していて、あなたのアクティビティの 'onActivityResult()'が呼び出されていますか? – CommonsWare

+0

はい、私はアプリを起動すると、私は欲しいので、多くの写真を撮ることができます。そして、私が戻るボタンを押すと、onActivityResult()が呼び出されます。しかし、私は1つの写真が撮影された後、ユーザーがOKまたは保存ボタンをクリックした後に呼びたいと思っていました。 – jupper

答えて

1

ACTION_IMAGE_CAPTUREの動作はカメラアプリまでです。何千ものデバイスモデルがあり、何百もの異なるカメラアプリが出荷されています。さらに、Playストアや他の場所からダウンロードできるカメラアプリもあります。

一部にバグがあります。

この場合、ACTION_IMAGE_CAPTUREになります。ユーザーが写真を撮るとアプリに戻ります。何らかの理由で、このカメラアプリの実装者は、それをしないか、またはテストしていませんでしたACTION_IMAGE_CAPTURE

ACTION_IMAGE_CAPTUREを使用している以外は実際には何もできません(カメラのAPIを直接使用するなど)。

+0

これは正しいヒントだった;-)。別のデバイスで試してみました。ありがとう! – jupper

0

私はあなたの問題は、createTempFile()メソッドを使用してのあなたがカメラで撮影した写真は、ディスク上で適切に保存することができないということだと思います。 また、テストに使用するアンドロイドのバージョンといくつかの詳細についていくつかの情報を提供する必要があります。 カメラで撮影した写真にタイムスタンプを使用しています。デフォルトでは、ファイル名が一意であることが保証されています。 createTempFile()メソッドを使用することは冗長です。私はあなたのコードを​​作成方法で試して、正しく動作します。

0

は、呼び出すアクティビティがこの期待される動作を閉じるときに呼び出されます。

「戻る」キーを押すと、アクティビティが閉じられ、結果が配信されます。

まだ開いているアクティビティから結果を得ることはできません。

+0

写真を撮った後で、自動的にアクティビティを閉じることはできますか? – jupper

+0

あなたはおそらく傾けますが、私はそれがあなたが使用しているカメラアプリケーションに依存すると仮定します。 – Kuffs

0

これが手の届かない範囲であれば、カメラを使ってキャプチャするカスタムアクティビティを作成することをお勧めします。 Hereはどのようにそれを行うことができるかの例です。私はそれをテストしていない。しかし、複雑に見えないので、あなたはそれを理解することができます。

関連する問題