現状、ギャラリーから画像を読み込むとそれを別の場所に保存し、表示するという関数を作っています。
その中で、最新版のAPIで廃止された関数を使っているのですが、これを廃止されていない関数に書き換えたいです。
(現状のコードでも最新APIでなければ動くことは動きます。)
関数は2つあり、1つはMediaStore.Images.Media.DATA、もう一つはEnvironment.getExternalStoragePublicDirectory についてです。
1.MediaStore.Images.Media.DATAについて
MainActivity
1val cr = contentResolver 2val columns = arrayOf(MediaStore.Images.Media.DATA) 3val c = cr.query(data!!.data!!, columns, null, null, null) 4c!!.moveToFirst() 5val original = File((c.getString(0)))
でギャラリーから選択した画像のファイル情報を取り出しています。この中のMediaStore.Images.Media.DATAが廃止関数なので、
別のやり方でギャラリーからファイル情報を取り出したいです。
2.Environment.getExternalStoragePublicDirectory について
MainActivity
1val mediaStorageDir = File(Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES), "savedPictures")
で選択したギャラリー画像を保存するフォルダの情報を取得しています。
場所としてはストレージ直下のPictureフォルダの中にフォルダを作り、その中にファイルを保存したいです。
(/storage/emulatede/0/Pictures/savedPictures)
この場所のファイル情報を別関数で取得したいです。
現状、ContextやIntentを使うやり方を模索していますが、アプリフォルダ内の「Picture」フォルダ内の
情報を取得するやり方しか見つけられていません。
applicationContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
返り値:/storage/emulated/0/Android/data/アプリ名/files/Pictures
詳細は下記コードです(言語はKotlinです)
MainActivity
1fun PictureSelect(){ 2 val i = Intent() 3 i.type = "image/*" // 画像のみが表示されるようにフィルターをかける 4 i.action = Intent.ACTION_GET_CONTENT 5 startActivityForResult(i, REQUEST_CODE_GALLERY) 6 Toast.makeText(applicationContext, "画像選択の画面です", Toast.LENGTH_LONG).show() 7 } 8 9public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 10 if (resultCode == Activity.RESULT_OK) { 11 REQUEST_CODE_GALLERY // ギャラリーの場合 12 -> try { 13 14 15 16 //廃止された関数1.MediaStore.Images.Media.DATA。 17 //この下から val original =...までの操作を代替関数でできないか模索中。 18 //公式リファレンスではcontentResolverを直に触るとよいと書いているがそのやり方が分からない。 19 val cr = contentResolver 20 val columns = arrayOf(MediaStore.Images.Media.DATA) 21 val c = cr.query(data!!.data!!, columns, null, null, null) 22 c!!.moveToFirst() 23 val original = File((c.getString(0))) 24 25 26 27 28 29 //廃止された関数2.Environment.getExternalStoragePublicDirectory 30 val mediaStorageDir = File(Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES), "savedPictures") 31 //返り値は/storage/emulatede/0/Pictures/savedPictures。 32 //別の廃止されてない関数でここに行きたい。 33 34 //以下はこれまでに試した関数 35 val mediaStorageDir2 = Environment.getRootDirectory().getPath() 36 //返り値:/system 37 val mediaStorageDir3 = Environment.getDataDirectory().getPath() 38 //返り値:/data 39 val mediaStorageDir4=applicationContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES) 40 //返り値:/storage/emulated/0/Android/data/アプリ名/files/Pictures 41 //内部ストレージの中に保存。PCと繋いで画像を取り出すのが難しいのでここには保存したくない。 42 43 44 45 46 47 48 if (!mediaStorageDir.exists() and !mediaStorageDir.mkdir()) { 49 return 50 } 51 //以下、ギャラリーから選んだファイルをコピーして保存。名前はsavedPicture.JPGに統一。 52 val savePath=mediaStorageDir.getPath() + separator + "savedPicture.JPG" 53 val saveFile:File = File(savePath) 54 original.copyRecursively(saveFile, true) 55 56 var degree=getRotateDegree(savePath) 57 val options = BitmapFactory.Options() 58 options.inJustDecodeBounds=false 59 options.inSampleSize = 4 60 var bitmap = BitmapFactory.decodeFile(savePath, options); 61 62 var matrix = Matrix() 63 matrix.postRotate(degree.toFloat()); 64 65 var rotatedImage = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 66 var out = FileOutputStream(karipath); 67 rotatedImage.compress(Bitmap.CompressFormat.JPEG, 100, out); 68 val imgView = findViewById<ImageView>(R.id.ImageView) 69 imgView?.setImageBitmap(rotatedImage) 70 } catch (e: Exception) { 71 e.printStackTrace() 72 } 73 } 74 75 } 76 } 77
回答1件
あなたの回答
tips
プレビュー