質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3158閲覧

Android Studio にて画像の回転やサイズ変更をしようとするとアプリが停止する

sekaikan_ozaki

総合スコア65

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1グッド

0クリップ

投稿2019/06/03 08:23

編集2019/06/03 08:37

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}
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どの様なエラーが出ているか確認しましょう。
エラーは、Logcat にでています。

投稿2019/06/07 15:22

kamikaze.cappa

総合スコア558

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sekaikan_ozaki

2019/06/10 01:15

logcatを確認しましたところ、エラーの内容がわかりました。 回転ボタンを押した際に、bitmapにちゃんとcameraUriが入っていない状態でgetWidthでサイズを取り出そうとしたためでした。 ここを直したとろ、正常に動きました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問