2019年5月25日土曜日

android開発 カメラ起動・写真撮影

2019 May 25.

"AndroidManifest.xml"
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="YOUR.PACKAGE.sampletakephotogetimagefile">
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>




  1. package YOUR.PACKAGE.sampletakephotogetimagefile;
  2. import android.Manifest;
  3. import android.annotation.TargetApi;
  4. import android.content.ContentResolver;
  5. import android.content.ContentValues;
  6. import android.content.Intent;
  7. import android.content.pm.PackageManager;
  8. import android.database.Cursor;
  9. import android.net.Uri;
  10. import android.os.Build;
  11. import android.provider.MediaStore;
  12. import android.support.annotation.NonNull;
  13. import android.support.v7.app.AppCompatActivity;
  14. import android.os.Bundle;
  15. import android.text.format.DateFormat;
  16. import android.view.View;
  17. import android.widget.Button;
  18. import android.widget.ImageView;
  19. import android.widget.TextView;
  20. import android.widget.Toast;
  21.  
  22. public class MainActivity extends AppCompatActivity {
  23.  
  24. Button button_take_photo;
  25. ImageView image_view;
  26. TextView text_view_uri_path, text_view_file_path, text_view_image_title;
  27. static final int REQUEST_CAPTURE_IMAGE = 100;
  28. private final int REQUEST_PERMISSION__EX_STORAGE = 1000;
  29. private final int REQUEST_PERMISSION_CAMERA = 1010;
  30.  
  31. Uri pictureUri;
  32.  
  33. @Override
  34. protected void onCreate(Bundle savedInstanceState) {
  35. super.onCreate(savedInstanceState);
  36. setContentView(R.layout.activity_main);
  37.  
  38. findViews();
  39.  
  40. // check & get permissions
  41. if(Build.VERSION.SDK_INT >= 23){
  42. checkPermission();
  43. }
  44. if (checkSelfPermission(Manifest.permission.CAMERA) !=
  45. PackageManager.PERMISSION_GRANTED){
  46. button_take_photo.setText(R.string.button_unable_phote );
  47. button_take_photo.setEnabled(false);
  48. }
  49.  
  50. setListeners();
  51. }
  52.  
  53.  
  54. protected void findViews(){
  55. button_take_photo = findViewById(R.id.button_take_photo);
  56. image_view = findViewById(R.id.imageView);
  57. text_view_uri_path = findViewById(R.id.textViewUriPath);
  58. text_view_file_path = findViewById(R.id.textViewFilePath);
  59. text_view_image_title = findViewById(R.id.textViewImageTitle);
  60. }
  61.  
  62.  
  63. // Permissionの確認
  64. // from https://akira-watson.com/android/mediastore.html
  65. @TargetApi(Build.VERSION_CODES.M)
  66. public void checkPermission() {
  67. if (checkSelfPermission(Manifest.permission.CAMERA) !=
  68. PackageManager.PERMISSION_GRANTED){
  69. requestCameraPermission();
  70. }
  71. if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
  72. PackageManager.PERMISSION_GRANTED){
  73. requestExStoragePermission();
  74. }
  75. }
  76.  
  77.  
  78. // CameraPermission許可を求める
  79. @TargetApi(Build.VERSION_CODES.M)
  80. private void requestCameraPermission() {
  81. if (shouldShowRequestPermissionRationale( Manifest.permission.CAMERA)) {
  82. requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);
  83.  
  84. } else {
  85. Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません",
  86. Toast.LENGTH_SHORT);
  87. toast.show();
  88. requestPermissions(new String[]{Manifest.permission.CAMERA }, REQUEST_PERMISSION_CAMERA);
  89. }
  90. }
  91.  
  92.  
  93. // ExternalStoragePermission許可を求める
  94. @TargetApi(Build.VERSION_CODES.M)
  95. private void requestExStoragePermission() {
  96. if (shouldShowRequestPermissionRationale( Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
  97. requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
  98. REQUEST_PERMISSION__EX_STORAGE);
  99.  
  100. } else {
  101. Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません",
  102. Toast.LENGTH_SHORT);
  103. toast.show();
  104. requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE },
  105. REQUEST_PERMISSION__EX_STORAGE);
  106. }
  107. }
  108.  
  109.  
  110. // requestPermission結果に対する処理
  111. @Override
  112. public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions,
  113. @NonNull int[] grantResults) {
  114. if (requestCode == REQUEST_PERMISSION_CAMERA) {
  115. if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
  116. // 拒否された時の対応
  117. Toast toast = Toast.makeText(this, "これ以上なにもできません",
  118. Toast.LENGTH_SHORT);
  119. toast.show();
  120. }
  121. } else if (requestCode == REQUEST_PERMISSION__EX_STORAGE) {
  122. if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
  123. // 拒否された時の対応
  124. Toast toast = Toast.makeText(this, "これ以上なにもできません",
  125. Toast.LENGTH_SHORT);
  126. toast.show();
  127. }
  128. } else {
  129. Toast toast = Toast.makeText(this,
  130. "Bad requestCode", Toast.LENGTH_SHORT);
  131. toast.show();
  132. }
  133. }
  134.  
  135.  
  136. protected void setListeners(){
  137. // カメラ起動ボタンが押された時
  138. button_take_photo.setOnClickListener(new View.OnClickListener() {
  139.  
  140. @Override
  141. public void onClick(View v) {
  142. /*
  143. 写真用情報を収集し、ContentResolverを使ってandroidに備わっている
  144. MediaStore.Images.Mediaデータベースに写真用情報を追加し、そのURI
  145. を取得する
  146. */
  147. long dateTaken = System.currentTimeMillis();
  148. String filename = DateFormat.format("yyyy-MM-dd_kk:mm:ss", dateTaken).toString() + ".jpg";
  149. ContentResolver contentResolver = getContentResolver();
  150. ContentValues values = new ContentValues(5);
  151. values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
  152. values.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis()/1000);
  153. values.put(MediaStore.Images.Media.TITLE, filename);
  154. values.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
  155. values.put(MediaStore.Images.Media.DATE_TAKEN,System.currentTimeMillis());
  156. pictureUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  157.  
  158. // カメラを起動する
  159. Intent intent = new Intent();
  160. intent.setAction("android.media.action.IMAGE_CAPTURE");
  161. intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
  162. // MediaStore.EXTRA_OUTPUTで指定したpictureUriに、撮影後に画像データが書き込まれる
  163. startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);
  164. }
  165. });
  166. }
  167.  
  168.  
  169. // このアクティビティから起動された他の機能から戻ってきた時の処理
  170. @Override
  171. protected void onActivityResult(int requestCode, int resultCode, Intent data ) {
  172.  
  173. /*
  174. 正しい結果が得られなかった場合の処理
  175. 撮影キャンセルなどするとこっちに来る
  176. */
  177. if (resultCode != RESULT_OK) {
  178.  
  179. // カメラ撮影からの復帰の時
  180. if (requestCode == REQUEST_CAPTURE_IMAGE) {
  181. Toast toast = Toast.makeText(this,"resultCode != RESULT_OK",
  182. Toast.LENGTH_LONG);
  183. toast.show();
  184. return;
  185. }
  186. }
  187.  
  188. /*
  189. * 写真撮影できた場合
  190. */
  191. if (requestCode == REQUEST_CAPTURE_IMAGE) {
  192. if (data == null ) {
  193. Toast.makeText(this, "data == null ",
  194. Toast.LENGTH_SHORT).show();
  195.  
  196. } else if ( data.getData() == null) {
  197. Toast.makeText(this, "data.getData() == null",Toast.LENGTH_SHORT).show();
  198. }
  199.  
  200. // 撮影した写真を取り出す
  201. image_view.setImageURI(pictureUri);
  202. text_view_uri_path.setText("Uri path: " + pictureUri.getPath());
  203.  
  204. // get filepath & title from uri
  205. ContentResolver contentResolver = this.getContentResolver();
  206. String[] columns =
  207. {
  208. MediaStore.Images.Media.DATA,
  209. MediaStore.Images.Media.TITLE
  210. };
  211. Cursor cursor = contentResolver.query(pictureUri, columns, null,
  212. null, null);
  213. if(cursor == null) return;
  214. int pathIndex = cursor.getColumnIndex( MediaStore.Images.Media.DATA);
  215. int titleIndex = cursor.getColumnIndex( MediaStore.Images.Media.TITLE);
  216. cursor.moveToFirst();
  217. String filePath = cursor.getString(pathIndex);
  218. String imageTitle = cursor.getString(titleIndex);
  219.  
  220. text_view_file_path.setText(filePath);
  221. text_view_image_title.setText(imageTitle);
  222.  
  223. return;
  224. }
  225. }
  226. }

0 件のコメント:

コメントを投稿