{"id":43897,"date":"2020-01-16T16:19:10","date_gmt":"2020-01-16T07:19:10","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=43897"},"modified":"2020-01-16T16:27:17","modified_gmt":"2020-01-16T07:27:17","slug":"%ec%9d%b4%eb%af%b8%ec%a7%80%ec%9d%98-%ec%b6%94%ea%b0%80-%ec%82%ad%ec%a0%9c-%eb%b3%80%ea%b2%bd%ec%82%ac%ed%95%ad%ec%9d%84-%ea%b0%90%ec%a7%80%ed%95%98%ea%b3%a0-%ec%82%ad%ec%a0%9c%eb%90%9c-uri%ec%9d%b8","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=43897","title":{"rendered":"\uc774\ubbf8\uc9c0\uc758 \ucd94\uac00\/\uc0ad\uc81c \ubcc0\uacbd\uc0ac\ud56d\uc744 \uac10\uc9c0\ud558\uace0 \uc0ad\uc81c\ub41c Uri\uc778\uc9c0 \ud655\uc778\ud558\uae30"},"content":{"rendered":"<p>\ub0b4 \uc571\uc774 \uc544\ub2cc \ub2e4\ub978 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ubbf8\ub514\uc5b4(\uc774\ubbf8\uc9c0, \ub3d9\uc601\uc0c1 \ub610\ub294 \ud30c\uc77c)\uc744 \ucd94\uac00\/\uc0ad\uc81c \uc5ec\ubd80\ub97c \uac10\uc9c0\ud558\uae30 \uc704\ud574\uc11c\ub294<\/p>\n<p>ContentObserver\ub97c \ub2e4\uc74c\uacfc \ud655\uc7a5\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre class=\"lang: decode:true\">class PickleContentObserver(val activity:FragmentActivity) : ContentObserver(Handler()), LifecycleObserver{\r\n    ...\r\n    val contentChangedEvent = SingleLiveEvent&lt;Void&gt;() \/\/ Activity \ub610\ub294 Fragment\uc5d0\uc11c \uad6c\ub3c5\r\n\r\n    init {\r\n        activity.lifecycle.addObserver(this)\r\n        activity.contentResolver.registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, this)\r\n        activity.contentResolver.registerContentObserver(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, this)\r\n    }\r\n\r\n    override fun onChange(selfChange: Boolean, uri: Uri?) {\r\n        super.onChange(selfChange, uri)\r\n        contentChangedEvent.postValue(null)\r\n        logger.i(\"onChange : selfChange = $selfChange uri = $uri\")\r\n    }\r\n\r\n    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)\r\n    fun onDestroy(){\r\n        activity.contentResolver.unregisterContentObserver(this)\r\n    }\r\n}<\/pre>\n<p>\ub2e4\ub978 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc73c\ub85c \ubd80\ud130 \uc0c8\ub85c\uc6b4 \ubbf8\ub514\uc5b4\uac00 \ucd94\uac00\/\uc0ad\uc81c\ub41c \uacbd\uc6b0\ub294 \uae30\uc874 \ubbf8\ub514\uc5b4 \ub9ac\uc2a4\ud2b8\ub97c \ubb34\ud6a8\ud654\ud558\uace0 \uc0c8\ub85c\uc6b4 Cursor\ub85c\ubd80\ud130 \ucd5c\uc2e0 \ub370\uc774\ud130\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.\u00a0<\/p>\n<p>\ud558\uc9c0\ub9cc \ubbf8\ub514\uc5b4\uac00 \uc0ad\uc81c\ub418\uae30 \uc804\uc5d0 \ud2b9\uc815 \ubbf8\ub514\uc5b4\uc758 id \ub610\ub294 Uri\ub97c \ub530\ub85c \uad00\ub9ac\ud558\uace0 \uc788\uace0, \ud2b9\uc815 \ubbf8\ub514\uc5b4 \uc0ad\uc81c \uc774\ud6c4 \uae30\uc874 \uc120\ud0dd\ub41c \ubbf8\ub514\uc5b4 \ubaa9\ub85d\uc5d0 \ub300\ud55c \uc720\ud6a8\uc131 \uac80\uc0ac\uac00 \ud544\uc694\ud558\ub2e4. \ub2e4\uc2dc \ub9d0\ud558\uc790\uba74 \uccb4\ud06c\ubc15\uc2a4\ub85c \uc120\ud0dd\ub41c \uc0ac\uc9c4\uc774 \ub2e4\ub978 \uc571\uc5d0\uc11c \uc0ad\uc81c\ub418\uba74 \uc0ac\uc9c4\ub3c4 \uc0ad\uc81c \ud574\uc57c\ub418\uc9c0\ub9cc \uccb4\ud06c\ubc15\uc2a4\ub85c \uc120\ud0dd\ub418\uc5c8\ub358 \uc0c1\ud0dc\ub3c4 \uc0ad\uc81c\ud574\uc57c\ud55c\ub2e4.<\/p>\n<p>\ubbf8\ub514\uc5b4\uc758 id\ub85c Uri\uc758 \uc815\ubcf4\ub97c \uc5bb\ub294 \ubc29\ubc95\uc740 \uac04\ub2e8\ud558\ub2e4.<\/p>\n<pre class=\"lang: decode:true \">var uri = ContentUris.withAppendedId(\uc0c1\uc704\ucf58\ud150\uce20Uri, id) \r\n\/\/ \uc608) \uc0ac\uc9c4 : MediaStore.Images.Media.EXTERNAL_CONTENT_URI<\/pre>\n<p>\ud574\ub2f9 \ubbf8\ub514\uc5b4\uc758 Uri\uac00 \uc774\ubbf8 \uc788\ub2e4\uba74 \uc704\uc758 \uacfc\uc815\uc740 \uac74\ub108\ub6f4\ub2e4.<\/p>\n<p>\uc774\uc81c Uri\uac00 \uc2e4\uc81c\ub85c \uc874\uc7ac\ud558\ub294 \ud30c\uc77c\uc778\uc9c0 \ud655\uc778\ud558\ub824\uba74 \ub2e4\uc74c \ucf54\ub4dc\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. <a href=\"https:\/\/chromium.googlesource.com\/chromium\/src\/base\/+\/master\/android\/java\/src\/org\/chromium\/base\/ContentUriUtils.java\">\uad6c\uae00 \ud06c\ub85c\ubbf8\uc6c0 \uc624\ud508\uc18c\uc2a4 \ucc38\uc870<\/a><\/p>\n<pre class=\"lang: decode:true \">class ContentResolverUtil(val context: Context) {\r\n    ...\r\n    private val contentResolver: ContentResolver = context.contentResolver\r\n    fun isExist(uri: Uri) :Boolean{\r\n        var pfd:ParcelFileDescriptor? = null\r\n        try {\r\n            pfd = contentResolver.openFileDescriptor(uri, \"r\")\r\n            return pfd!=null\r\n        } catch (e:FileNotFoundException){\r\n            logger.w(e.toString())\r\n        }finally {\r\n            try {\r\n                pfd?.close()\r\n            }catch (e :IOException){\r\n                logger.w(e.toString())\r\n            }\r\n        }\r\n        return false\r\n    }\r\n    ...\r\n}<\/pre>\n<p>ContentResolver\ub85c\ubd80\ud130 query() \uba54\uc11c\ub4dc\uc5d0 \uc870\uac74\uc808\uc744 \ucd94\uac00\ud558\uc5ec \ud638\ucd9c\ud558\ub294 \uac83\ub3c4 \ubc29\ubc95\uc774 \ub420 \uc218 \uc788\ub2e4.<\/p>\n<pre class=\"lang: decode:true \">val cursor = contentResolver.query(\r\n    uri, \/\/ \ubbf8\ub514\uc5b4 Uri \r\n    arrayOf(MediaStore.MediaColumns._ID),\r\n    null,\r\n    null,\r\n    null)\r\nif(cursor.count == 0){\r\n    logger.i(\"\uc0ad\uc81c\ub41c \ubbf8\ub514\uc5b4\")\r\n}<\/pre>\n<p>\ud558\uc9c0\ub9cc \uc57d 18\ub9cc\uac1c\uc758 \uc0ac\uc9c4, \ub3d9\uc601\uc0c1 \ubbf8\ub514\uc5b4\ub97c \uac00\uc9c0\uace0 Galaxsy S9\uc73c\ub85c \ud14c\uc2a4\ud2b8 \ud574\ubcf8 \uacb0\uacfc\u00a0 ParcelFileDescriptor\uc758 \uc778\uc2a4\ud134\uc2a4 \uc874\uc7ac \uc720\ubb34\ub97c \uccb4\ud06c\ud558\ub294\uac83\uc774 \ube44\uc6a9\uc774 \ub354 \uc801\uc5c8\ub2e4.<\/p>\n<p>query()\ub85c \ubbf8\ub514\uc5b4 \uc2a4\ud1a0\uc5b4 \ud14c\uc774\ube14\uc5d0 \ud574\ub2f9 Uri\uac00 \uc874\uc7ac\ud558\ub294\uc9c0 \uccb4\ud06c\ud560 \ub54c\ub294 <strong>6~8ms \uc18c\uc694<\/strong><\/p>\n<p>ParcelFileDescriptor\uc758 null\uc5ec\ubd80\ub97c \uccb4\ud06c\ud560 \ub54c\ub294 <strong>3~5ms \uc18c\uc694\u00a0<\/strong><\/p>\n<p><iframe loading=\"lazy\" width=\"480\" height=\"477\" src=\"https:\/\/giphy.com\/embed\/CCLZ53CmdBN5u\" frameborder=\"0\" class=\"giphy-embed\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ub0b4 \uc571\uc774 \uc544\ub2cc \ub2e4\ub978 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ubbf8\ub514\uc5b4(\uc774\ubbf8\uc9c0, \ub3d9\uc601\uc0c1 \ub610\ub294 \ud30c\uc77c)\uc744 \ucd94\uac00\/\uc0ad\uc81c \uc5ec\ubd80\ub97c \uac10\uc9c0\ud558\uae30 \uc704\ud574\uc11c\ub294 ContentObserver\ub97c \ub2e4\uc74c\uacfc \ud655\uc7a5\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. class PickleContentObserver(val activity:FragmentActivity) : ContentObserver(Handler()), LifecycleObserver{ &#8230; val contentChangedEvent = SingleLiveEvent&lt;Void&gt;() \/\/ Activity \ub610\ub294 Fragment\uc5d0\uc11c \uad6c\ub3c5 init { activity.lifecycle.addObserver(this) activity.contentResolver.registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, this) activity.contentResolver.registerContentObserver(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, this) } override fun onChange(selfChange: Boolean, uri: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[5],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/43897"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=43897"}],"version-history":[{"count":2,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/43897\/revisions"}],"predecessor-version":[{"id":43899,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/43897\/revisions\/43899"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=43897"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=43897"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=43897"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}