{"id":10595,"date":"2020-11-09T15:45:37","date_gmt":"2020-11-09T06:45:37","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10595"},"modified":"2020-12-05T15:48:51","modified_gmt":"2020-12-05T06:48:51","slug":"%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c%ec%97%90%ec%84%9c-%ec%82%ac%ec%a7%84-%ec%b0%8d%ec%9d%80-%ed%9b%84-%ed%95%b4%eb%8b%b9-%ec%82%ac%ec%a7%84%ec%9d%84-%ed%8c%8c%ec%9d%bc%eb%a1%9c-%ec%a0%80","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10595","title":{"rendered":"[Android] \uc0ac\uc9c4 \ucc0d\uc740 \ud6c4 \ud574\ub2f9 \uc0ac\uc9c4\uc744 \ud30c\uc77c\ub85c \uc800\uc7a5\ud574 \ud45c\uc2dc\ud558\uae30"},"content":{"rendered":"<p>\uc774 \uae00\uc740 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc0ac\uc9c4\uc744 \ucc0d\uc740 \ud6c4 \uc6d0\ubcf8 \uc774\ubbf8\uc9c0\ub97c \ud30c\uc77c\ub85c \uc800\uc7a5\ud558\uace0 ImageView\uc5d0 \ud574\ub2f9 \uc0ac\uc9c4 \uc774\ubbf8\uc9c0\ub97c \ud45c\uc2dc\ud558\ub294 \uc608\uc81c\uc774\ub2e4.<\/p>\n<p>\uba3c\uc800 \uce74\uba54\ub77c \uae30\ub2a5 \ubc0f \uc678\ubd80 \uc800\uc7a5\uc18c\uc5d0 \ub300\ud55c \uc77d\uae30\/\uc4f0\uae30 \ud37c\ubbf8\uc158\uc744 \uc9c0\uc815\ud558\uae30 \uc704\ud574 AndroidManifest.xml\uc5d0 \ub2e4\uc74c \ucf54\ub4dc\ub97c \ucd94\uac00\ud55c\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">\r\n&lt;uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" \/>\r\n&lt;uses-permission android:name=\"android.permission.CAMERA\" \/>\r\n&lt;uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" \/>\r\n&lt;uses-feature android:name=\"android.hardware.camera2\" android:required=\"true\" \/>\r\n<\/pre>\n<p>\uc774\uc655 AndroidManifest.xml \ud30c\uc77c\uc744 \ud3b8\uc9d1\ud558\ub294 \uae40\uc5d0 Provider\ub97c \ucd94\uac00\ud558\uc790. Provider\ub97c \ucd94\uac00\ud558\ub294  \uc774\uc720\ub294 \uc678\ubd80 \uce74\uba54\ub77c \uc571\uc744 \uc5f0\ub3d9\ud574\uc11c \uc0ac\uc9c4\uc744 \ucc0d\uc744 \uac74\ub370, \uce74\uba54\ub77c \uc571\uc774 \uc0ac\uc9c4\uc744 \ucc0d\uc740 \ud6c4 \uc9c0\uc815\ub41c \ud30c\uc77c\uc5d0 \uc0ac\uc9c4 \uc774\ubbf8\uc9c0\ub97c \uc800\uc7a5\ud558\ub3c4\ub85d \ud558\uae30 \uc704\ud574 \ud30c\uc77c\uc5d0 \ub300\ud55c Provider\uac00 \ud544\uc694\ud558\uae30 \ub54c\ubb38\uc774\ub2e4. \ucd94\uac00\ud55c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">\r\n&lt;application ... >\r\n\r\n    &lt;provider\r\n        android:authorities=\"com.example.myapplication.fileprovider\"\r\n        android:name=\"androidx.core.content.FileProvider\"\r\n        android:exported=\"false\"\r\n        android:grantUriPermissions=\"true\">\r\n        &lt;meta-data\r\n            android:name=\"android.support.FILE_PROVIDER_PATHS\"\r\n            android:resource=\"@xml\/file_paths\" \/>\r\n    &lt;\/provider>\r\n\r\n    ...\r\n<\/pre>\n<p>\uc704\uc758 Provider \ucf54\ub4dc \uc911 android:authorities \uc18d\uc131\uac12\uc5d0\ub294 App\uc758 Package\uba85\uc5d0 &#8220;.fileprovider&#8221;\ub97c \ubd99\uc5ec \uc9c0\uc815\ud558\uc600\ub2e4. \ud30c\uc77c Provider\uac00 \uc678\ubd80\uc758 \uc571\uc5d0 \uacf5\uc720\ud558\uace0\uc790 \ud558\ub294 \ub514\ub809\ud1a0\ub9ac\ub97c meta-data\uc5d0 \uc9c0\uc815\ud558\uace0 \uc788\ub294\ub370 xml \ud30c\uc77c\uc740 file_paths\uc5d0 \uad00\ub828 \uc815\ubcf4\ub97c \uc9c0\uc815\ud588\uc73c\uba70 \ub2e4\uc74c\uacfc \uac19\ub2e4. \ub9ac\uc18c\uc2a4\uc5d0 xml \ud3f4\ub354\ub97c \ub9cc\ub4e0 \ud6c4\uc5d0 file_paths.xml \ud30c\uc77c\uc744 \ucd94\uac00\ud55c \ub4a4 \uc544\ub798\uc758 \ub0b4\uc6a9\uc744 \uc785\ub825\ud55c\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">\r\n&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;paths xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\">\r\n    &lt;external-path name=\"files\" path=\"Android\/data\/com.example.myapplication\/files\" \/>\r\n&lt;\/paths>\r\n<\/pre>\n<p>\uc704\uc758 \ub0b4\uc6a9\uc740 \uc774 \uc571\uc774 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac\uc778 Android\/data\/com.example.myapplication\/files\uc758 \ud558\uc704 \ud3f4\ub354 \uc804\uccb4\ub97c \uacf5\uc720\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\uce74\uba54\ub77c\ub97c \uc2e4\ud589\ud558\uace0 \uc0ac\uc9c4\uc744 \ucc0d\uc5b4 \uadf8 \ub0b4\uc6a9\uc744 \ud45c\uc2dc\ud558\ub294 UI\uc5d0 \ub300\ud55c \ub808\uc774\uc544\uc6c3\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">\r\n&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    android:orientation=\"vertical\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\">\r\n\r\n    &lt;Button\r\n        android:layout_width=\"100dp\"\r\n        android:layout_height=\"58dp\"\r\n        android:id=\"@+id\/btn_photo\"\r\n        android:layout_gravity=\"center\"\r\n        android:text=\"\uc0ac\uc9c4\ucc0d\uae30\" \/>\r\n\r\n\r\n    &lt;ImageView\r\n        android:id=\"@+id\/iv_photo\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"match_parent\" \/>\r\n\r\n&lt;\/LinearLayout>\r\n<\/pre>\n<p>\uc774\uc81c \uc774 \ub808\uc774\uc544\uc6c3\uc5d0 \ub300\ud55c Activity \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\">\r\npackage com.example.myapplication\r\n\r\nimport android.Manifest\r\nimport android.content.Intent\r\nimport android.content.pm.PackageManager\r\nimport android.graphics.ImageDecoder\r\nimport android.net.Uri\r\nimport android.os.Build\r\nimport androidx.appcompat.app.AppCompatActivity\r\nimport android.os.Bundle\r\nimport android.os.Environment\r\nimport android.provider.MediaStore\r\nimport android.util.Log\r\nimport android.widget.Button\r\nimport android.widget.ImageView\r\nimport androidx.core.app.ActivityCompat\r\nimport androidx.core.content.FileProvider\r\nimport java.io.File\r\nimport java.io.IOException\r\nimport java.text.SimpleDateFormat\r\nimport java.util.*\r\n\r\nclass MainActivity : AppCompatActivity() {\r\n    val TAG = \"DIP2K\"\r\n    lateinit var btn_photo: Button\r\n    lateinit var iv_photo: ImageView\r\n\r\n    var m_imageFile: File? = null\r\n    val REQUEST_TAKE_PHOTO = 100\r\n\r\n    override fun onCreate(savedInstanceState: Bundle?) {\r\n        super.onCreate(savedInstanceState)\r\n        setContentView(R.layout.activity_main)\r\n\r\n        iv_photo = findViewById(R.id.iv_photo)\r\n        btn_photo = findViewById(R.id.btn_photo)\r\n\r\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\r\n            if(checkSelfPermission(Manifest.permission.CAMERA) \r\n                == PackageManager.PERMISSION_GRANTED \r\n                && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) \r\n                    == PackageManager.PERMISSION_GRANTED) {\r\n            } else {\r\n                ActivityCompat.requestPermissions(this,\r\n                    arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)\r\n            }\r\n        }\r\n\r\n        btn_photo.setOnClickListener {\r\n            val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)\r\n            if(takePictureIntent.resolveActivity(getPackageManager()) != null) {\r\n                createImageFile()?.let {\r\n                    val photoURI = FileProvider.getUriForFile(this,\r\n                        \"com.example.myapplication.fileprovider\", it)\r\n\r\n                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)\r\n                    startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO)\r\n\r\n                    m_imageFile = it\r\n                }\r\n            }\r\n\r\n        }\r\n    }\r\n\r\n    override fun onRequestPermissionsResult(\r\n        requestCode: Int,\r\n        permissions: Array&lt;out String>,\r\n        grantResults: IntArray\r\n    ) {\r\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\r\n\r\n        if(grantResults[0] == PackageManager.PERMISSION_GRANTED \r\n            && grantResults[1] == PackageManager.PERMISSION_GRANTED) {\r\n            Log.d(TAG, \"Permisson: \" + permissions[0] + \" was \" + grantResults[0])\r\n        }\r\n    }\r\n\r\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\r\n        super.onActivityResult(requestCode, resultCode, data)\r\n        if(requestCode == REQUEST_TAKE_PHOTO) {\r\n            if(resultCode == RESULT_OK) {\r\n                m_imageFile?.let {\r\n                    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\r\n                        val source = ImageDecoder.createSource(contentResolver, Uri.fromFile(it))\r\n                        ImageDecoder.decodeBitmap(source)?.let {\r\n                            iv_photo.setImageBitmap(it)\r\n                        }\r\n                    } else {\r\n                        MediaStore.Images.Media.getBitmap(contentResolver, Uri.fromFile(it))?.let {\r\n                            iv_photo.setImageBitmap(it)\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private fun createImageFile(): File {\r\n        val timeStamp = SimpleDateFormat(\"yyyyMMdd_HHmmss\").format(Date())\r\n        val imageFileName = \"PHOTO_${timeStamp}.jpg\"\r\n        val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)\r\n        return File(storageDir, imageFileName)\r\n    }\r\n}\r\n<\/pre>\n<p>\uc2e4\ud589 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/11\/device-2020-11-09-154352.png\" alt=\"\" width=\"700\" class=\"aligncenter size-full wp-image-10601\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774 \uae00\uc740 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc0ac\uc9c4\uc744 \ucc0d\uc740 \ud6c4 \uc6d0\ubcf8 \uc774\ubbf8\uc9c0\ub97c \ud30c\uc77c\ub85c \uc800\uc7a5\ud558\uace0 ImageView\uc5d0 \ud574\ub2f9 \uc0ac\uc9c4 \uc774\ubbf8\uc9c0\ub97c \ud45c\uc2dc\ud558\ub294 \uc608\uc81c\uc774\ub2e4. \uba3c\uc800 \uce74\uba54\ub77c \uae30\ub2a5 \ubc0f \uc678\ubd80 \uc800\uc7a5\uc18c\uc5d0 \ub300\ud55c \uc77d\uae30\/\uc4f0\uae30 \ud37c\ubbf8\uc158\uc744 \uc9c0\uc815\ud558\uae30 \uc704\ud574 AndroidManifest.xml\uc5d0 \ub2e4\uc74c \ucf54\ub4dc\ub97c \ucd94\uac00\ud55c\ub2e4. &lt;uses-permission android:name=&#8221;android.permission.WRITE_EXTERNAL_STORAGE&#8221; \/> &lt;uses-permission android:name=&#8221;android.permission.CAMERA&#8221; \/> &lt;uses-permission android:name=&#8221;android.permission.READ_EXTERNAL_STORAGE&#8221; \/> &lt;uses-feature android:name=&#8221;android.hardware.camera2&#8243; android:required=&#8221;true&#8221; \/> \uc774\uc655 AndroidManifest.xml \ud30c\uc77c\uc744 \ud3b8\uc9d1\ud558\ub294 \uae40\uc5d0 Provider\ub97c \ucd94\uac00\ud558\uc790. Provider\ub97c \ucd94\uac00\ud558\ub294 \uc774\uc720\ub294 \uc678\ubd80 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10595\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[Android] \uc0ac\uc9c4 \ucc0d\uc740 \ud6c4 \ud574\ub2f9 \uc0ac\uc9c4\uc744 \ud30c\uc77c\ub85c \uc800\uc7a5\ud574 \ud45c\uc2dc\ud558\uae30&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61,1],"tags":[],"class_list":["post-10595","post","type-post","status-publish","format-standard","hentry","category-android","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10595"}],"version-history":[{"count":10,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10595\/revisions"}],"predecessor-version":[{"id":10688,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10595\/revisions\/10688"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10595"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}