[銅貨アンドロイド]Googleマップキャプチャボタンの作成


Googleマップを含むアプリケーションを作成するときに、マップクリップをキャプチャして画像として保存したい場合があります.
Googleでビューからビットマップを取得すると、黒い画面しか見えません.
Google map APIはすでに良い機能を持っており、簡単に使用できます.

1.地図オブジェクトの取得

class MainActivity : AppCompatActivity(), OnMapReadyCallback {
	//캡쳐 버튼
	private val screenShotButton: AppCompatButton by lazy {
        findViewById<AppCompatButton>(R.id.screenShotButton)
    }
	...
    
    override fun onCreate(savedInstanceState: Bundle?) {
        
		// 프래그먼트를 xml에서 정적으로 추가한 경우
        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment

        mapFragment.getMapAsync(this)
        
まず指導対象を取得する.
地図計画のgetMapAsyncを使用してGoogleMapオブジェクトを要求します.
このパラメータを使用して、現在のオブジェクトのOnMapReadyCallbackをコールバックとして登録します.
地図オブジェクトの準備が完了すると、OnMapReadyCallbackは実装済みのOnMapReadyを実行します.

2.onMapReadyでボタンにリスナーを追加

override fun onMapReady(googleMap: GoogleMap) {

        screenShotButton.setOnClickListener {
            googleMap.snapshot {
                it?.let{
                    saveMediaToStorage(it)
                }
            }
        }
}
onMapReadyパラメータのgoogleMapを使用して地図を処理できます.
このgooglemapはずっと地図を使っているので、保存したほうがいいです.
スクリーンショットボタンを押すと、ボタンにOnClickListenerを付けてスクリーンショットします.
かっこに動作を書けばいいので、地図のコードを書けばいいです.
マップショットはGoogle Mapオブジェクトのsnapshotメソッドを使用できます.
パラメータはSnapshotReadyCallbackで、Ramda形式で関数を記述すればよい.
SnapshotReadyCallbackのonSnapshotReadyはNullable Bitmapからパラメータに移動します.
itと書いてあるのは来たBitmap
Nullableですか?セキュアコールを使用すると、空でない場合にのみストレージが実行されます.
saveMediaStorage()は、ビットマップを受信して格納する方法です.グーグルで見つけたものを下に書きます.

3.saveMediaToStorageメソッド

private fun saveMediaToStorage(bitmap: Bitmap) {
        // Generating a file name
        val filename = "${System.currentTimeMillis()}.jpg"

        // Output stream
        var fos: OutputStream? = null

        // For devices running android >= Q
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // getting the contentResolver
            this.contentResolver?.also { resolver ->

                // Content resolver will process the contentvalues
                val contentValues = ContentValues().apply {

                    // putting file information in content values
                    put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
                    put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg")
                    put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
                }

                // Inserting the contentValues to
                // contentResolver and getting the Uri
                val imageUri: Uri? = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

                // Opening an outputstream with the Uri that we got
                fos = imageUri?.let { resolver.openOutputStream(it) }
            }
        } else {
            // These for devices running on android < Q
            val imagesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            val image = File(imagesDir, filename)
            fos = FileOutputStream(image)
        }

        fos?.use {
            // Finally writing the bitmap to the output stream that we opened
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it)
            Toast.makeText(this , "Captured View and saved to Gallery" , Toast.LENGTH_SHORT).show()
        }
    }
渡されたビットマップを画像ファイルの関数として保存します.

4.完了



この画面で紫色のスクリーンショットをクリックします

スクリーンをきれいに切ることができます!