PCスペック
Windows7 64bit
メモリ 8GB
プロセッサ Intel Core i7-3610
デモ用端末(XPERIA OS:7.0 API 24)
Android Studio 3.4
表題の通りなのですが、撮影した写真が表示されたあと、「回転」&「拡大」をタップすると、
アプリが停止してしまいます。
写真が横向きになったり小さい見た目が嫌でそれを直すために実装していた途中でした。
写真の表示までは上手く言ってるので、その画像をBitmapに入れる部分やMatrixを形成する段階で、エラー吐いてるはずだと思います。
(撮影した写真をデータベースへ登録してから表示しています。)
どのようにすれば直るのかどなたか教えていただけませんでしょうか..?
以下ソースコードです。
java
1package com.example.camera4; 2 3import android.Manifest; 4import android.content.ContentResolver; 5import android.content.ContentValues; 6import android.content.Intent; 7import android.content.pm.PackageManager; 8import android.graphics.Bitmap; 9import android.graphics.BitmapFactory; 10import android.graphics.Matrix; 11import android.graphics.drawable.BitmapDrawable; 12import android.graphics.drawable.Drawable; 13import android.net.Uri; 14import android.os.Build; 15import android.os.Environment; 16import android.provider.MediaStore; 17import android.support.annotation.NonNull; 18import android.support.v4.app.ActivityCompat; 19import android.support.v4.content.FileProvider; 20import android.support.v7.app.AppCompatActivity; 21import android.os.Bundle; 22import android.util.Log; 23import android.view.View; 24import android.widget.Button; 25import android.widget.ImageView; 26import android.widget.Toast; 27 28 29 30import java.io.File; 31import java.text.SimpleDateFormat; 32import java.util.Date; 33import java.util.Locale; 34 35public class MainActivity extends AppCompatActivity { 36 37 private final static int RESULT_CAMERA = 1001;//カメラ起動の認証のようなもの 38 private final static int REQUEST_PERMISSION = 1002;//他アプリを使用許可得るための認証のようなもの 39 40 private ImageView imageView;//画面に表示 41 private Uri cameraUri;//カメラのリソース識別子 42 private String filePath;//ファイルの文字列パス 43 44 @Override 45 protected void onCreate(Bundle savedInstanceState) { 46 super.onCreate(savedInstanceState); 47 Log.d("debug","onCreate()"); 48 setContentView(R.layout.activity_main); 49 50 imageView = findViewById(R.id.image_view);//画像の表示 51 52 Button cameraButton = findViewById(R.id.camera_button);//ボタンの表示 53 cameraButton.setOnClickListener(new View.OnClickListener() { 54 @Override 55 public void onClick(View v) { 56 // Android 6, API 23以上でパーミッシンの確認 57 if (Build.VERSION.SDK_INT >= 23) {//APIのバージョンが23以上だったら 58 checkPermission();//許可の確認 59 } 60 else { 61 cameraIntent();//カメラ起動 62 } 63 } 64 65 }); 66 67 Button button1 = findViewById(R.id.button1);//ボタンの表示 68 button1.setOnClickListener(new View.OnClickListener() { 69 @Override 70 public void onClick(View v){ 71 // イメージ画像がクリックされたときに実行される処理 72 73 // resource画像ををbitmapとして取り出す 74 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),R.id.image_view); 75 // bitmap画像をImgeViewに設定 76 imageView.setImageBitmap(bitmap1); 77 78 // 画像の横、縦サイズを取得 79 int imageWidth = bitmap1.getWidth(); 80 int imageHeight = bitmap1.getHeight(); 81 82 // Matrix インスタンス生成 83 Matrix matrix = new Matrix(); 84 85 // 画像中心を基点に90度回転 86 matrix.setRotate(90, imageWidth/2, imageHeight/2); 87 88 // 90度回転したBitmap画像を生成 89 Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, imageWidth, imageHeight, matrix, true); 90 91 imageView.setImageBitmap(bitmap2); 92 } 93 }); 94 95 96 Button button2 = findViewById(R.id.button2);//ボタンの表示 97 button2.setOnClickListener(new View.OnClickListener() { 98 @Override 99 public void onClick(View v){ 100 // イメージ画像がクリックされたときに実行される処理 101 102 // resource画像ををbitmapとして取り出す 103 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),R.id.image_view); 104 // bitmap画像をImgeViewに設定 105 imageView.setImageBitmap(bitmap1); 106 107 // 画像の横、縦サイズを取得 108 int imageWidth = bitmap1.getWidth(); 109 int imageHeight = bitmap1.getHeight(); 110 111 // Matrix インスタンス生成 112 Matrix matrix = new Matrix(); 113 114 // 1/2の縮小率 115 float ratio = 0.5f; 116 117 // resize 118 matrix.preScale(ratio, ratio); 119 120 Bitmap bitmap3 = Bitmap.createBitmap(bitmap1, 0, 0, 121 imageWidth, imageHeight, matrix, true); 122 123 // drawableに変換 124 Drawable drawable = new BitmapDrawable(getResources(), bitmap3); 125 126 imageView.setImageDrawable(drawable); 127 128 } 129 }); 130 131 132 133 } 134 135 private void cameraIntent(){ 136 Log.d("debug","cameraIntent()"); 137 138 // 保存先のフォルダーを作成するケース 139 File cameraFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"IMG"); 140 cameraFolder.mkdirs(); 141 142 // 保存先のフォルダーをカメラに指定した場合 143 //File cameraFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),"Camera"); 144 145 146 // 保存ファイル名 147 String fileName = new SimpleDateFormat("ddHHmmss", Locale.US).format(new Date());//データのフォーマット決め 148 filePath = String.format("%s/%s.jpg", cameraFolder.getPath(),fileName);//画像ファイルの場所までの文字列(ファイルパス) 149 Log.d("debug","filePath:"+filePath); 150 151 // capture画像のファイルパス 152 File cameraFile = new File(filePath); 153 //ファイルからURIを取得 154 cameraUri = FileProvider.getUriForFile(MainActivity.this, getApplicationContext().getPackageName() + ".fileprovider", cameraFile); 155 156 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//カメラ起動 157 intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);//撮影画像をURIに付ける 158 startActivityForResult(intent, RESULT_CAMERA);// 159 160 Log.d("debug","startActivityForResult()"); 161 } 162 163 @Override 164 protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 165 // requestしたコードがRESULT_CAMERAであるか確認する 166 if (requestCode == RESULT_CAMERA) {//認証が一致したら 167 168 if(cameraUri != null){//URIに画像データが入っていたら 169 imageView.setImageURI(cameraUri);//画像を画面に出力 170 171 registerDatabase(filePath);//データベースへ登録 172 } 173 else{ 174 Log.d("debug","cameraUri == null"); 175 } 176 } 177 } 178 179 180 181 182 183 184 // アンドロイドのデータベースへ登録する 185 private void registerDatabase(String file) { 186 ContentValues contentValues = new ContentValues();//contentValuesインスタンスを作成 187 ContentResolver contentResolver = MainActivity.this.getContentResolver();// 188 contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");//ontecntValuesにキーと値を追加 189 contentValues.put("_data", file);//contentValuesにキーと値を追加//contentValuesにキーと値を追加 190 contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);//contentResolverに挿入 191 } 192 193 // Runtime Permission check 194 private void checkPermission(){ 195 // いままでアプリを使ってて既に許可している 196 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){ 197 cameraIntent(); 198 } 199 // 拒否していた場合 200 else{ 201 requestPermission(); 202 } 203 } 204 205 // 許可を求める 206 private void requestPermission() { 207 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 208 ActivityCompat.requestPermissions(MainActivity.this, 209 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 210 REQUEST_PERMISSION); 211 212 } else { 213 Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません", Toast.LENGTH_SHORT); 214 toast.show(); 215 216 ActivityCompat.requestPermissions(this, 217 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,}, 218 REQUEST_PERMISSION); 219 220 } 221 } 222 223 // 結果の受け取り 224 @Override 225 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 226 227 Log.d("debug","onRequestPermissionsResult()"); 228 229 if (requestCode == REQUEST_PERMISSION) { 230 // 使用が許可された 231 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 232 cameraIntent(); 233 234 } else { 235 // それでも拒否された時の対応 236 Toast toast = Toast.makeText(this, 237 "これ以上なにもできません", Toast.LENGTH_SHORT); 238 toast.show(); 239 } 240 } 241 } 242 243}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/10 01:15