{"id":1257,"date":"2021-11-17T22:02:50","date_gmt":"2021-11-17T13:02:50","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=1257"},"modified":"2025-09-12T17:24:18","modified_gmt":"2025-09-12T08:24:18","slug":"android-sensor%ec%9d%98-%ec%82%ac%ec%9a%a9-rotation-vector%eb%a5%bc-%ec%9d%b4%ec%9a%a9%ed%95%9c-%eb%82%98%ec%b9%a8%eb%b0%98-%ec%bd%94%ec%96%b4-%eb%a7%8c%eb%93%a4%ec%96%b4%eb%b3%b4%ea%b8%b0","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2021\/11\/17\/1257\/","title":{"rendered":"Android: Sensor\uc758 \uc0ac\uc6a9, Rotation Vector\ub97c \uc774\uc6a9\ud55c \ub098\uce68\ubc18 \ucf54\uc5b4 \ub9cc\ub4e4\uc5b4\ubcf4\uae30"},"content":{"rendered":"\n<p> \uc0ac\uc2e4, \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc13c\uc11c\ub97c \uc774\uc6a9\ud55c \uad6c\ud604\uc744 \uc774\uc804\uc5d0 \ud574\ubcf4\uc9c0 \ubabb\ud588\ub2e4. \uc774\ubc88\uc5d0 \ud544\uc694\ud55c \uae30\ud68c\uac00 \uc0dd\uaca8\uc11c \uc54c\uc544\ubcf4\ub294 \uae40\uc5d0 \uc815\ub9ac\ub97c \ud558\uae30\ub85c \ub9c8\uc74c\uba39\uc5c8\ub2e4. \uc13c\uc11c\ub77c\ub294\uac8c \uc885\ub958\ub3c4 \ub9ce\uace0, \uae30\uae30\ub9c8\ub2e4 \ub2ec\ub824\uc788\ub294 \uac83\ub3c4 \ub2e4\ub974\uace0, \uac01\uac01 \uc8fc\uc5b4\uc9c0\ub294 \ub370\uc774\ud130\ub3c4 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \ubaa8\ub4e0\uac78 \ub2e4\ub8f0 \uc218\ub294 \uc5c6\uc744\uac70 \uac19\uace0, \uae30\ubcf8\uc801\uc73c\ub85c \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c SensorManager\ub97c \ud1b5\ud574 \uc13c\uc11c\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95, \uadf8 \uc911\uc5d0\uc11c TYPE_ROTATION_VECTOR\ub97c \uc774\uc6a9\ud574 \ub098\uce68\ubc18\uacfc \uac19\uc740\uac78 \ub9cc\ub4e4\uc5b4 \ubcf4\ub824\ud55c\ub2e4. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc13c\uc11c\uc758 \ubd84\ub958<\/h3>\n\n\n\n<p> \uc548\ub4dc\ub85c\uc774\ub4dc \uacf5\uc2dd \ubb38\uc11c\uc758 \uc13c\uc11c \uac1c\uc694\ubd80\ubd84\uc744 \ubcf4\uba74, \uc13c\uc11c\ub4e4\uc744 \ub2e4\uc74c 3\uac00\uc9c0\ub85c \ud070 \ubd84\ub958\ub97c \ud558\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Motion Sensors<\/strong> : \uac00\uc18d\uacc4(accelerometers), \uc911\ub825\uacc4(gravity sensors), \uc790\uc774\ub85c\uc2a4\ucf54\ud504(gyroscopes), \ub85c\ud14c\uc774\uc158 \ubca1\ud130(rotation vector sensors)<\/li>\n\n\n\n<li><strong>Position Sensors<\/strong> : \uc624\ub9ac\uc5d4\ud14c\uc774\uc158 \uc13c\uc11c(orientation sensor), \uc9c0\uc790\uae30\uc13c\uc11c(magnetometers)<\/li>\n\n\n\n<li><strong>Environment Sensors<\/strong> : \uae30\uc555\uacc4(barometers), \uc628\ub3c4\uacc4(thermometers), \uad11\ub3c4\uacc4(photometers)<\/li>\n<\/ul>\n\n\n\n<p> \ub0b4\uac00\uc4f0\ub294 \uc0bc\uc131 <a href=\"https:\/\/www.samsung.com\/sec\/smartphones\/galaxy-a32-a325\/SM-A325NLVAKOO\/\">a32 \uc2a4\ud399<\/a>\uc744 \ud655\uc778\ud574\ubcf4\uba74, \uac00\uc18d\ub3c4\uc13c\uc11c, \uc9c0\ubb38\uc13c\uc11c, \uc790\uc774\ub85c \uc13c\uc11c, \uc9c0\uc790\uae30 \uc13c\uc11c, \ud640 \uc13c\uc11c, RGB\uad11 \uc13c\uc11c, \uac00\uc0c1 \uadfc\uc811 \uc13c\uc2f1\uc774 \uc788\ub2e4\uace0 \ub418\uc5b4 \uc788\ub2e4. \uc870\uae08 \ub0af\uc120 \uc774\ub984\uc758 \ud640 \uc13c\uc11c\ub294 \uc790\uae30\uc7a5\uc5d0 \ub530\ub77c \uc804\ub958\uac00 \ubcc0\ud558\ub294 \uc13c\uc11c\ub85c NFC\uc6a9\ub3c4\ub85c \ubcf4\uc774\uace0, \uad11\uc13c\uc11c\ub294 \uc870\ub3c4 \uc790\ub3d9\uc870\uc808, \uadfc\uc811\uc13c\uc11c\ub294 \ud1b5\ud654\uc2dc \ud654\uba74 \uc624\ud504\uc6a9\uc73c\ub85c \ubcf4\uc778\ub2e4.<br> <\/p>\n\n\n\n<p> \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc13c\uc11c \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uc704\uc5d0\uc11c \ub098\uc5f4\ud55c HW sensor\ub4e4\ub85c\ubd80\ud130 raw \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud558\uae30\ub3c4 \ud558\uc9c0\ub9cc, SW Sensor\ub4e4\ub3c4 \uc874\uc7ac\ud55c\ub2e4. SW Sensor\ub77c \ud558\uba74, HW \uc13c\uc11c\ub4e4\uc758 \uac01\uc885 \uc815\ubcf4\ub97c \uc870\ud569\ud574\uc11c \uc0ac\uc6a9\uc790\uac00 raw \ub370\uc774\ud130\ubcf4\ub2e4 \uc811\uadfc\ud558\uae30 \uc26c\uc6b4 \ub370\uc774\ud130\ub97c \ub9cc\ub4e4\uc5b4\ub0b8\ub2e4. \uc774\ub807\uac8c HW\ub4e0 SW\ub4e0 \ud0c0\uc785\uc744 \uc815\uc758\ud574 \ub1a8\ub294\ub370, \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 \uc13c\uc11c\ud0c0\uc785\uc740 <a href=\"https:\/\/developer.android.com\/guide\/topics\/sensors\/sensors_overview#sensors-intro\">\ubb38\uc11c<\/a>\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub098\uc640\uc788\ub2e4. <\/p>\n\n\n\n<p id=\"table1\"><strong>Table 1.<\/strong>&nbsp;Sensor types supported by the Android platform.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th scope=\"col\">Sensor<\/th><th scope=\"col\">Type<\/th><th scope=\"col\">Description<\/th><th scope=\"col\">Common Uses<\/th><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_ACCELEROMETER\">TYPE_<wbr>ACCELEROMETER<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the acceleration force in m\/s<sup>2<\/sup>&nbsp;that is applied to a device on all three physical axes (x, y, and z), including the force of gravity.<\/td><td>Motion detection (shake, tilt, etc.).<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_AMBIENT_TEMPERATURE\">TYPE_<wbr>AMBIENT_<wbr>TEMPERATURE<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the ambient room temperature in degrees Celsius (\u00b0C). See note below.<\/td><td>Monitoring air temperatures.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_GRAVITY\">TYPE_<wbr>GRAVITY<\/a><\/code><\/td><td>Software or Hardware<\/td><td>Measures the force of gravity in m\/s<sup>2<\/sup>&nbsp;that is applied to a device on all three physical axes (x, y, z).<\/td><td>Motion detection (shake, tilt, etc.).<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_GYROSCOPE\">TYPE_<wbr>GYROSCOPE<\/a><\/code><\/td><td>Hardware<\/td><td>Measures a device&#8217;s rate of rotation in rad\/s around each of the three physical axes (x, y, and z).<\/td><td>Rotation detection (spin, turn, etc.).<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_LIGHT\">TYPE_<wbr>LIGHT<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the ambient light level (illumination) in lx.<\/td><td>Controlling screen brightness.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_LINEAR_ACCELERATION\">TYPE_<wbr>LINEAR_<wbr>ACCELERATION<\/a><\/code><\/td><td>Software or Hardware<\/td><td>Measures the acceleration force in m\/s<sup>2<\/sup>&nbsp;that is applied to a device on all three physical axes (x, y, and z), excluding the force of gravity.<\/td><td>Monitoring acceleration along a single axis.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_MAGNETIC_FIELD\">TYPE_<wbr>MAGNETIC_<wbr>FIELD<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the ambient geomagnetic field for all three physical axes (x, y, z) in \u03bcT.<\/td><td>Creating a compass.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_ORIENTATION\">TYPE_<wbr>ORIENTATION<\/a><\/code><\/td><td>Software<\/td><td>Measures degrees of rotation that a device makes around all three physical axes (x, y, z). As of API level 3 you can obtain the inclination matrix and rotation matrix for a device by using the gravity sensor and the geomagnetic field sensor in conjunction with the&nbsp;<code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#getRotationMatrix(float[],%20float[],%20float[],%20float[])\">getRotationMatrix()<\/a><\/code>&nbsp;method.<\/td><td>Determining device position.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_PRESSURE\">TYPE_<wbr>PRESSURE<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the ambient air pressure in hPa or mbar.<\/td><td>Monitoring air pressure changes.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_PROXIMITY\">TYPE_<wbr>PROXIMITY<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the proximity of an object in cm relative to the view screen of a device. This sensor is typically used to determine whether a handset is being held up to a person&#8217;s ear.<\/td><td>Phone position during a call.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_RELATIVE_HUMIDITY\">TYPE_<wbr>RELATIVE_<wbr>HUMIDITY<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the relative ambient humidity in percent (%).<\/td><td>Monitoring dewpoint, absolute, and relative humidity.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_ROTATION_VECTOR\">TYPE_<wbr>ROTATION_<wbr>VECTOR<\/a><\/code><\/td><td>Software or Hardware<\/td><td>Measures the orientation of a device by providing the three elements of the device&#8217;s rotation vector.<\/td><td>Motion detection and rotation detection.<\/td><\/tr><tr><td><code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_TEMPERATURE\">TYPE_<wbr>TEMPERATURE<\/a><\/code><\/td><td>Hardware<\/td><td>Measures the temperature of the device in degrees Celsius (\u00b0C). This sensor implementation varies across devices and this sensor was replaced with the&nbsp;<code><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/Sensor#TYPE_AMBIENT_TEMPERATURE\">TYPE_<wbr>AMBIENT_<wbr>TEMPERATURE<\/a><\/code>&nbsp;sensor in API Level 14<\/td><td>Monitoring temperatures.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\ub514\ubc14\uc774\uc2a4\uc758 \uc13c\uc11c \ubaa9\ub85d\uc744 \ud55c \ubc88 \uc0b4\ud3b4\ubcfc\uae4c?<\/h3>\n\n\n\n<p>\ud504\ub85c\uadf8\ub798\ubc0d\uc801\uc73c\ub85c \uc13c\uc11c \ubaa9\ub85d \ubc0f \uc815\ubcf4\ub97c SensorManager\ub85c\ubd80\ud130 \uc5bb\uc5b4\uc62c \uc218 \uc788\ub2e4. getSensorList(Sensor.TYPE_ALL)\uc744 \uc0ac\uc6a9\ud558\uba74\ub41c\ub2e4. getSensorList()\ud568\uc218\ub294 \uc778\uc790\ub85c \uc13c\uc11c \ud0c0\uc785\uc744 \ub118\uaca8\uc918\uc57c \ud558\ub294\ub370, \uc704\uc5d0 \ub098\uc5f4\ud55c \uc548\ub4dc\ub85c\uc774\ub4dc \uc13c\uc11c\ud0c0\uc785\uc744 \ub118\uaca8\uc8fc\uba74, \uadf8 \ud0c0\uc785\uc744 \uc9c0\uc6d0\ud558\ub294 \uc13c\uc11c \ubaa9\ub85d\uc744 \ub3cc\ub824\uc900\ub2e4. \uc5ec\uae30\uc11c \uc13c\uc11c \ud0c0\uc785\uc5d0 TYPE_ALL\uc744 \ub118\uaca8\uc8fc\uba74 \ubaa8\ub4e0 \ubaa9\ub85d\uc744 \ubc1b\uc544\uc624\ub294 \uac83\uc774\ub2e4. \ub2e4\uc74c\uc740 Fragment\uc5d0\uc11c \uc0ac\uc6a9\ud55c \uc608\uc81c\ucf54\ub4dc\uc774\ub2e4. Fragment\uac00 \ub730 \ub54c, Timber \ub85c\uadf8\ub85c sensor \ub9ac\uc2a4\ud2b8 \uc815\ubcf4\ub4e4\uc744 \ubfcc\ub824\uc8fc\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>...\n    private lateinit var sensorManager: SensorManager\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        sensorManager = requireContext().getSystemService(Context.SENSOR_SERVICE) as SensorManager\n    }\n\n\n...\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val deviceSensors: List&lt;Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)\n        deviceSensors.forEach { sensor ->\n            Timber.d(\"name: ${sensor.name}, type: ${sensor.stringType}, power: ${sensor.power}, \" +\n                    \"resolution: ${sensor.resolution}, range: ${sensor.maximumRange}, \" +\n                    \"vendor: ${sensor.vendor}, version: ${sensor.version}\")\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">lateinit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> sensorManager: <\/span><span style=\"color: #F69D50\">SensorManager<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        sensorManager <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">requireContext<\/span><span style=\"color: #ADBAC7\">().<\/span><span style=\"color: #DCBDFB\">getSystemService<\/span><span style=\"color: #ADBAC7\">(Context.SENSOR_SERVICE) <\/span><span style=\"color: #F47067\">as<\/span><span style=\"color: #ADBAC7\"> SensorManager<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onViewCreated<\/span><span style=\"color: #ADBAC7\">(view: <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">, savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onViewCreated<\/span><span style=\"color: #ADBAC7\">(view, savedInstanceState)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> deviceSensors: <\/span><span style=\"color: #F69D50\">List<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Sensor<\/span><span style=\"color: #ADBAC7\">&gt; <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> sensorManager.<\/span><span style=\"color: #DCBDFB\">getSensorList<\/span><span style=\"color: #ADBAC7\">(Sensor.TYPE_ALL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        deviceSensors.<\/span><span style=\"color: #DCBDFB\">forEach<\/span><span style=\"color: #ADBAC7\"> { sensor <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Timber.<\/span><span style=\"color: #DCBDFB\">d<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;name: ${sensor.name}, type: ${sensor.stringType}, power: ${sensor.power}, &quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    <\/span><span style=\"color: #96D0FF\">&quot;resolution: ${sensor.resolution}, range: ${sensor.maximumRange}, &quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    <\/span><span style=\"color: #96D0FF\">&quot;vendor: ${sensor.vendor}, version: ${sensor.version}&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc77c\ub2e8, \uc13c\uc11c\uc758 \uc0ac\uc6a9\uc740 SensorManager\ub97c \ud1b5\ud574 \uac00\ub2a5\ud558\ub2e4. getSystemService()\ub97c \ud1b5\ud574 SensorManager\ub97c \uc5bb\uc5b4\uc624\ub294\uac8c \uc2dc\uc791\uc774\ub2e4. \uc13c\uc11c \ubaa9\ub85d\uc744 \uc5bb\uc5b4\uc624\ub294 getSensorList() \uba54\uc18c\ub4dc\ub294 SensorManager\uc758 \uba64\ubc84\ub85c \uc5bb\uc5b4\uc628 SensorManager\uc5d0\uc11c \ubc14\ub85c \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>name: BMI160 Accelerometer, type: android.sensor.accelerometer, power: 0.18, resolution: 0.0023956299, range: 39.22661, vendor: BOSCH, version: 2062705\nname: BMI160 Accelerometer Uncalibrated, type: android.sensor.accelerometer_uncalibrated, power: 0.18, resolution: 0.0023956299, range: 39.22661, vendor: BOSCH, version: 2062705\nname: MMC3630KJ Magnetometer, type: android.sensor.magnetic_field, power: 0.32, resolution: 0.09765625, range: 3000.0, vendor: MEMSIC, version: 1\n...<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F69D50\">name:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">BMI160<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">Accelerometer,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">type:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">android.sensor.accelerometer,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">power:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0.18<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">resolution:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0.0023956299<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">range:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">39.22661<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">vendor:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">BOSCH,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">version:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2062705<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">name:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">BMI160<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">Accelerometer<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">Uncalibrated,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">type:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">android.sensor.accelerometer_uncalibrated,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">power:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0.18<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">resolution:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0.0023956299<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">range:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">39.22661<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">vendor:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">BOSCH,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">version:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2062705<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">name:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">MMC3630KJ<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">Magnetometer,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">type:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">android.sensor.magnetic_field,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">power:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0.32<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">resolution:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0.09765625<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">range:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">3000.0<\/span><span style=\"color: #96D0FF\">,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">vendor:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">MEMSIC,<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">version:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6CB6FF\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc704\uc5d0\uc11c \ucd9c\ub825\uacb0\uacfc\uc758 \uc77c\ubd80\ub97c \ubcf4\uc5ec\uc8fc\uace0 \uc788\ub294\ub370 \ubcf4\uba74, \uc13c\uc11c \uc774\ub984, \ud0c0\uc785, \ub808\uc878\ub8e8\uc158, \ub808\uc778\uc9c0, \ubca4\ub354, \ubc84\uc804 \ub4f1\ub4f1\uc758 \uc815\ubcf4\ub97c \ub3cc\ub824\uc900\ub2e4. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc13c\uc11c \uc720\ubb34 \ud655\uc778<\/h3>\n\n\n\n<p>\uc704\uc758 \uacb0\uacfc\uc5d0\uc11c \uc54c \uc218 \uc788\uc9c0\ub9cc, \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc815\ud55c \ud558\ub098\uc758 \uc13c\uc11c \ud0c0\uc785\uc5d0 \ub300\ud574 \uc5ec\ub7ec\uac1c\uc758 \uc13c\uc11c\uac00 \uc0ac\uc6a9\ub420 \uc218 \uc788\ub2e4. getDefaultSensor() \ud568\uc218\ub97c \uc774\uc6a9\ud558\uba74, \uc774 \uc5ec\ub7ec\uac1c\uc758 \uc13c\uc11c\uc911\uc5d0 \ub514\ud3f4\ud2b8 \uc13c\uc11c\ub97c \ub3cc\ub824\uc8fc\uac8c \ub41c\ub2e4. \uc13c\uc11c \ud0c0\uc785\uc744 \uc9c0\uc6d0\ud558\ub294 \ucd5c\uc18c \ud558\ub098\uc758 \uc13c\uc11c\uac00 \uc788\uc5b4\uc57c \ud574\ub2f9 \uc13c\uc11c\ud0c0\uc785\uc774 \uc791\ub3d9\ud558\ub294 \uac83\uc774\ubbc0\ub85c, getDefaultSensor()\ub85c \uac12\uc744 \ubc1b\uc544\uc640\uc11c \uac12\uc774 \uc788\uc73c\uba74, \uc13c\uc11c\ub97c \uc9c0\uc6d0\ud558\ub294 \uac83\uc774\uace0, \uac12\uc774 \uc5c6\uc774 null\uc774\uba74 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\uac83\uc774 \ub41c\ub2e4. \uc608\uc81c\ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>if(sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) != null) {\n    Timber.d(\"Get TYPE_ROTATION_VECTOR Success.\")\n}else {\n    Timber.d(\"Get TYPE_ROTATION_VECTOR failed.\")\n}\n\nif(sensorManager.getDefaultSensor(Sensor.TYPE_HEART_BEAT) != null) {\n    Timber.d(\"Get TYPE_HEART_BEAT Success.\")\n}else {\n    Timber.d(\"Get TYPE_HEART_BEAT failed.\")\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(sensorManager.<\/span><span style=\"color: #DCBDFB\">getDefaultSensor<\/span><span style=\"color: #ADBAC7\">(Sensor.TYPE_ROTATION_VECTOR) <\/span><span style=\"color: #F47067\">!=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    Timber.<\/span><span style=\"color: #DCBDFB\">d<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Get TYPE_ROTATION_VECTOR Success.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    Timber.<\/span><span style=\"color: #DCBDFB\">d<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Get TYPE_ROTATION_VECTOR failed.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(sensorManager.<\/span><span style=\"color: #DCBDFB\">getDefaultSensor<\/span><span style=\"color: #ADBAC7\">(Sensor.TYPE_HEART_BEAT) <\/span><span style=\"color: #F47067\">!=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    Timber.<\/span><span style=\"color: #DCBDFB\">d<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Get TYPE_HEART_BEAT Success.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    Timber.<\/span><span style=\"color: #DCBDFB\">d<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Get TYPE_HEART_BEAT failed.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Get TYPE_ROTATION_VECTOR Success.\nGet TYPE_HEART_BEAT failed.<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">Get TYPE_ROTATION_VECTOR Success.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Get TYPE_HEART_BEAT failed.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc608\uc81c\ub97c \uc2e4\ud589\ud55c \uacb0\uacfc\ub97c \ubcf4\uba74, \ud14c\uc2a4\ud2b8\ud55c \ub514\ubc14\uc774\uc2a4\uc5d0\uc11c ROTATION_VECTOR \uc13c\uc11c\ub294 \uc788\uc9c0\ub9cc, HEART_BEAT\uc13c\uc11c\ub294 \uc5c6\ub294\uac78 \uc54c \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uad6c\uae00 \ud50c\ub808\uc774 \uc13c\uc11c \ud544\ud130\uc758 \uc0ac\uc6a9<\/h3>\n\n\n\n<p>\uc571\uc744 \ub9cc\ub4e4 \ub54c, \uc704\uc758 \ubc29\ubc95\uc73c\ub85c \ub7f0\ud0c0\uc784\uc5d0 \uc13c\uc11c\ub97c \uccb4\ud06c\ud560 \uc218\ub3c4 \uc788\uc9c0\ub9cc, \uc13c\uc11c\uac00 \uc5c6\ub294 \ub514\ubc14\uc774\uc2a4\ub4e4\uc774 \uc571\uc744 \ub2e4\uc6b4\ubc1b\uc9c0 \ubabb\ud558\uac8c \uc0ac\uc804\uc5d0 \ucc28\ub2e8\ud560 \uc218\ub3c4 \uc788\ub2e4. \ubc14\ub85c \uad6c\uae00 \ud50c\ub808\uc774 \ud544\ud130\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. Manifest \ud30c\uc77c\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;uses-feature android:name=\"android.hardware.sensor.accelerometer\"\n              android:required=\"true\" \/><\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #8DDB8C\">uses-feature<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">android:name<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;android.hardware.sensor.accelerometer&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">              <\/span><span style=\"color: #6CB6FF\">android:required<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;true&quot;<\/span><span style=\"color: #ADBAC7\"> \/&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc704\uc5d0\uc120 accelerometer\ub97c \uc9c0\uc815\ud588\uc73c\ubbc0\ub85c \uac00\uc18d\uacc4 \uc13c\uc11c\uac00 \uc788\uc5b4\uc57c \uad6c\uae00\ud50c\ub808\uc774\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc \uac00\ub2a5\ud574\uc9c4\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc13c\uc11c\uc5d0\uc11c \ub370\uc774\ud130 \ubc1b\uc544\uc624\uae30<\/h3>\n\n\n\n<p> \uc13c\uc11c\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubc1b\uc544\uc624\ub824\uba74, \ucf5c\ubc31\uc744 \ub4f1\ub85d\ud574 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. \ucf5c\ubc31\uc740 SensorEventListener \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0c1\uc18d\ubc1b\uc544 \uad6c\ud604\ud55c\ub2e4. Fragment\ub97c \uc0ac\uc6a9\ud55c \uc55e\uc758 \uc608\ub97c \ubcf8\ub2e4\uba74, \ub2e4\uc74c\uacfc \uac19\uc774 \ub41c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class CompassFragment : Fragment(), SensorEventListener {\n...\n    override fun onSensorChanged(event: SensorEvent?) {\n        ....\n    }\n    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {\n        ....\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">CompassFragment<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">Fragment<\/span><span style=\"color: #ADBAC7\">(), <\/span><span style=\"color: #DCBDFB\">SensorEventListener<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onSensorChanged<\/span><span style=\"color: #ADBAC7\">(event: <\/span><span style=\"color: #F69D50\">SensorEvent<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">....<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onAccuracyChanged<\/span><span style=\"color: #ADBAC7\">(sensor: <\/span><span style=\"color: #F69D50\">Sensor<\/span><span style=\"color: #ADBAC7\">?, accuracy: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">....<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>SensorEventListner\ub294 onSensorChanged()\uc640 onAccuracyChanged()\ub85c \uc774\ub8e8\uc5b4\uc838\uc788\ub2e4. onSensorChanged()\ub294 \uc13c\uc11c \uc5c5\ub370\uc774\ud2b8 \uc8fc\uae30\uc5d0 \ub530\ub77c \ub370\uc774\ud130 \uac12\uc744 \uc8fc\uac8c \ub418\uba70, onAccuracyChanged()\ub294 \uc815\ud655\ub3c4\uc758 \ubcc0\uacbd\uc2dc \ud638\ucd9c\ub41c\ub2e4. \uc815\ud655\ub3c4\uc758 \uc608\ub97c\ub4e4\uba74, \uad6c\uae00\ub9f5\ub4f1\uc744 \uc0ac\uc6a9\uc2dc, 8\uc790\ubaa8\uc591\uc73c\ub85c \ud3f0\uc744 \uc6c0\uc9c1\uc5ec \ubcf4\uc815\uc744 \ud558\ub77c\uace0 \uc2dc\ud0a4\ub294 \uacbd\uc6b0\uac00 \uc788\ub294\ub370, \uc815\ud655\ub3c4\uac00 \ub5a8\uc5b4\uc9c0\ub294 \uacbd\uc6b0\uc5d0 \ud574\ub2f9\ud55c\ub2e4. 8\uc790\ub85c \ud3f0\uc744 \uc6c0\uc9c1\uc774\ub2e4\ubcf4\uba74, \uc54c\uace0\ub9ac\uc998\uc740 \ubaa8\ub974\uaca0\uc9c0\ub9cc, \uc2e4\uc81c\ub85c \uc815\ud655\ub3c4\uac00 \uc62c\ub77c\uac04\ub2e4. onAccuracyChanged()\ub85c \ub118\uc5b4\uc624\ub294 \uc815\ud655\ub3c4\ub294 <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager\">SensorManager \ubb38\uc11c<\/a>\uc5d0\uc11c <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#SENSOR_STATUS_ACCURACY_HIGH\">SENSOR_STATUS_ACCURACY_HIGH<\/a>, <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#SENSOR_STATUS_ACCURACY_MEDIUM\">SENSOR_STATUS_ACCURACY_MEDIUM<\/a>, <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#SENSOR_STATUS_ACCURACY_LOW\">SENSOR_STATUS_ACCURACY_LOW<\/a>, <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#SENSOR_STATUS_NO_CONTACT\">SENSOR_STATUS_NO_CONTACT<\/a>, <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#SENSOR_STATUS_UNRELIABLE\">SENSOR_STATUS_UNRELIABLE<\/a> \ub85c \uc81c\uacf5\ub41c\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p> \uc704\uc640\uac19\uc774 SensorEventListener\ub97c \uad6c\ud604\ud588\ub2e4\uba74, \uc774\uac83\uc744 SensorManager\uc5d0 \uc0ac\uc6a9\ud560 \uc13c\uc11c\ud0c0\uc785\uacfc \uc13c\uc11c\ub97c \ub118\uaca8\uc8fc\uc5b4 \ub4f1\ub85d\ud574\uc57c \ud55c\ub2e4. \ubcf4\ud1b5\uc740 Activity\/Fragment\uc758 Resume\uc2dc\uc5d0 \ub4f1\ub85d\ud558\uace0 Pause\uc2dc\uc5d0 \ud574\uc81c\ud55c\ub2e4. UI\uac00 \ubc31\uadf8\ub77c\uc6b4\ub4dc\ub85c \uac14\uc744 \ub54c, \uc77c\ubc18\uc801\uc73c\ub85c \uc13c\uc11c\ub97c \uc0ac\uc6a9\ud560 \ud544\uc694\uac00 \uc5c6\uace0 \ud574\uc81c\ub97c \ud574\uc918\uc57c \ubc30\ud130\ub9ac \uc0ac\uc6a9\uc744 \uc904\uc5ec \ucd5c\uc801\ud654 \ud560 \uc218 \uc788\ub2e4. \uc774\ub7f0 \uacbd\uc6b0\uac00 \uc544\ub2c8\ub77c\uba74 \uc0c1\ud669\uc5d0 \ub9de\uac8c \ub4f1\ub85d\uacfc \ud574\uc81c\ub97c \ud1b5\ud574 \uc0ac\uc6a9\uac00\ub2a5\ud560 \uac83\uc774\ub2e4. \uc608\uc81c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>        rotationVectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)\n        if( rotationVectorSensor != null) {\n            Timber.d(\"Get TYPE_ROTATION_VECTOR Success.\")\n        }else {\n            Timber.d(\"Get TYPE_ROTATION_VECTOR failed.\")\n        }\n...\n\n    override fun onResume() {\n        super.onResume()\n        rotationVectorSensor?.also { sensor ->\n            sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL)\n        }\n    }\n\n    override fun onPause() {\n        super.onPause()\n        sensorManager.unregisterListener(this)\n    }\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">        rotationVectorSensor <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> sensorManager.<\/span><span style=\"color: #DCBDFB\">getDefaultSensor<\/span><span style=\"color: #ADBAC7\">(Sensor.TYPE_ROTATION_VECTOR)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">( rotationVectorSensor <\/span><span style=\"color: #F47067\">!=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Timber.<\/span><span style=\"color: #DCBDFB\">d<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Get TYPE_ROTATION_VECTOR Success.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Timber.<\/span><span style=\"color: #DCBDFB\">d<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Get TYPE_ROTATION_VECTOR failed.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onResume<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onResume<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        rotationVectorSensor?.<\/span><span style=\"color: #DCBDFB\">also<\/span><span style=\"color: #ADBAC7\"> { sensor <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            sensorManager.<\/span><span style=\"color: #DCBDFB\">registerListener<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">, sensor, SensorManager.SENSOR_DELAY_NORMAL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onPause<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onPause<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        sensorManager.<\/span><span style=\"color: #DCBDFB\">unregisterListener<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucf54\ub4dc\ub97c \ubcf4\uba74,  getDefaultSensor\ub85c TYPE_ROTATION_VECTOR \ud0c0\uc785 \uc13c\uc11c\ub97c \uc5bb\uc5b4\uc624\uace0 \uc788\ub2e4. Resume\ub2e8\uacc4 \uc774\uc804\uc5d0\ub9cc \ud574\uc8fc\uba74 \ub418\ub294 \uc791\uc5c5\uc774\ub2e4. onResume()\uc5d0\uc11c\ub294 \ud574\ub2f9 \uc13c\uc11c\uac00 \uc788\ub294 \uacbd\uc6b0, SensorManager.registerListener()\ub97c \uc774\uc6a9\ud558\uc5ec \ub4f1\ub85d, SensorManager.unregisterListener()\ub97c \uc774\uc6a9\ud558\uc5ec \ud574\uc81c\ud574 \uc8fc\uace0 \uc788\ub2e4. registerListener()\uc5d0\ub294 SensorEventListner \uc778\uc2a4\ud134\uc2a4, \uc55e\uc5d0\uc11c SensorManager\ub85c\ubd80\ud130 \uc5bb\uc5b4\uc628 \uc0ac\uc6a9\ud560 \uc13c\uc11c, \uadf8\ub9ac\uace0 \uc13c\uc11c \ud0c0\uc785\uc744 \ub118\uaca8\uc900\ub2e4. <\/p>\n\n\n\n<p> \uc774\ub807\uac8c \ucf5c\ubc31\uc744 \ub4f1\ub85d\ud558\uace0 \ub098\uba74, onSensorChanged()\uac00 \ubd88\ub9ac\ub294\ub370, SensorEvent \uac12\uc774 \ub118\uc5b4\uc624\uac8c \ub418\uace0, \uc5ec\uae30\uc5d0 \ub4e4\uc5b4\uc788\ub294 sensor\ub85c\ubd80\ud130 \ud0c0\uc785\uc744 \uccb4\ud06c\ud558\uc5ec \uac12\uc744 \ucc98\ub9ac\ud558\uba74 \ub41c\ub2e4. \uc608\uc81c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>    override fun onSensorChanged(event: SensorEvent?) {\n\n        event?.sensor?.run {\n            if(type == Sensor.TYPE_ROTATION_VECTOR){\n...<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onSensorChanged<\/span><span style=\"color: #ADBAC7\">(event: <\/span><span style=\"color: #F69D50\">SensorEvent<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        event?.sensor?.<\/span><span style=\"color: #DCBDFB\">run<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(type <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> Sensor.TYPE_ROTATION_VECTOR){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc88c\ud45c\uacc4<\/h3>\n\n\n\n<p>\uc13c\uc11c\ub85c\ubd80\ud130 \ub370\uc774\ud130\ub97c \ubc1b\uc544\uc624\ub294 \uae30\ubcf8\uc801\uc778 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubd24\ub294\ub370, \uc774\uac78 \uc774\uc6a9\ud574\uc11c \uac04\ub2e8\ud55c \ub098\uce68\ubc18\uae30\ub2a5\uc744 \uad6c\ud604\ud574\ubcf4\uc790. \uadf8\uc804\uc5d0 \uba3c\uc800 \uc54c\uc544\uc57c\ud560 \uac83\ub4e4\uc774 \uc880 \uc788\ub2e4. \uccab\ubc88\uc9f8\ub85c \uc88c\ud45c\uacc4\uc774\ub2e4. \uc5ec\ub7ec \uc13c\uc11c\ub4e4\uc774 \ub370\uc774\ud130\ub97c \ub118\uaca8\uc8fc\ub294\ub370, \uc88c\ud45c\uacc4\ub294 \uadf8 \ub370\uc774\ud130\uc758 \uae30\uc900\uc774 \ub41c\ub2e4. <\/p>\n\n\n\n<p> \uc13c\uc11c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ub514\ubc14\uc774\uc2a4\uc758 \uc88c\ud45c\uacc4\ub294 \ub2e4\uc74c \uadf8\ub9bc\uacfc \uac19\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"269\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/11\/axis_device.png\" alt=\"\" class=\"wp-image-1271\"\/><\/figure>\n<\/div>\n\n\n<p>\uc624\ub978\uc190 \uc88c\ud45c\uacc4\ub97c \uc0ac\uc6a9\ud558\ub294\ub370, \ub514\ubc14\uc774\uc2a4\uc758 \ud68c\uc804\uacfc\ub294 \ubb34\uad00\ud558\uac8c \uc720\uc9c0\ub41c\ub2e4. \uc8fc\uc758\ud560 \uc810\uc740, \ub514\ubc14\uc774\uc2a4\uc758 natural orientation\uc774 \uae30\uc900\uc774 \ub418\ub294\ub370, \uc774\uac8c \ud0c0\ube14\ub81b\uacfc \uac19\uc774 \ud56d\uc0c1 \ud3ec\ud2b8\ub808\uc774\ud2b8 \ubaa8\ub4dc\ub294 \uc544\ub2c8\ub77c\ub294 \uc810\uc774\ub2e4. \uc774\ub7f0 \uac83\ub4e4\uc744 \ubcf4\uc815\ud558\uae30\uc704\ud574 <a href=\"https:\/\/developer.android.com\/reference\/android\/view\/Display#getRotation()\">getRotation()<\/a>\uacfc <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#remapCoordinateSystem(float[],%20int,%20int,%20float[])\">remapCoordinateSystem()<\/a>\uc744 \uc774\uc6a9\ud558\uba74 \uc13c\uc11c \uc88c\ud45c\uacc4\ub97c \uc2a4\ud06c\ub9b0 \uc88c\ud45c\uacc4\ub85c \ubcc0\ud658\uc774 \uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n\n<p>Orientation sensor\ub098 Rotation Vector sensor\ub294 \ub514\ubc14\uc774\uc2a4\uc758 \ubaa8\uc158\uc774\ub098 \ud3ec\uc9c0\uc158\uc744 \uc9c0\uad6c \uc88c\ud45c\uacc4\ub97c \uae30\uc900\uc73c\ub85c \uacc4\uc0b0\ud574\uc11c \uc54c\ub824\uc900\ub2e4.  <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#getRotationMatrix(float[],%20float[],%20float[],%20float[])\">getRotationMatrix()<\/a>  \uacfc <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#getOrientation(float[],%20float[])\">getOrientation()<\/a> \ud568\uc218\ub4e4\uc744 \uc774\uc6a9\ud558\uc5ec \uc9c0\uad6c \uc88c\ud45c\uacc4 \uae30\uc900\uc73c\ub85c \ub514\ubc14\uc774\uc2a4\uc758 Azimuth(\ubc29\uc704\uac01, -z\ucd95 \uae30\uc900 \ud68c\uc804\uac01), Pitch( x\ucd95 \uae30\uc900 \ud68c\uc804\uac01), Roll( y\ucd95 \uae30\uc900 \ud68c\uc804\uac01) \uac12\uc744 \uc5bb\uc5b4\uc62c \uc218 \uc788\uc73c\ub2c8, \ucc38\uc870\ud558\uae30 \ubc14\ub780\ub2e4. \uc9c0\uad6c \uc88c\ud45c\uacc4\ub294 \uc9c0\ud45c\uba74 \uc0c1\uc5d0\uc11c\ub97c \uc758\ubbf8\ud558\uba70 \ub2e4\uc74c \uadf8\ub9bc\uacfc \uac19\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"246\" height=\"235\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/11\/world-coordinates.png\" alt=\"\" class=\"wp-image-1278\"\/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rotation Vector<\/h3>\n\n\n\n<p>rotation vector\ub294 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Axis%E2%80%93angle_representation\">Axis-angle \ud45c\ud604<\/a>\uc73c\ub85c \ubc29\ud5a5\ubca1\ud130\uc640 \uadf8 \ubca1\ud130\uc758 \ud68c\uc804\uac12 <em>\u03b8<\/em>  \ub450 \uac1c\ub85c \ud45c\ud604\ub41c\ub2e4. \uc774 \ud45c\ud604\ubc29\uc2dd\uc740 \uac15\uccb4(Rigid body)\uc758 \uc0c1\ud0dc\ub97c \ud45c\uc2dc\ud558\uae30\uc5d0 \uc801\ud569\ud558\ub2e4. \uc5ec\uae30\uc120 \ud578\ub4dc\ud3f0\uc744 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. <\/p>\n\n\n\n<p><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorEvent.html#values\">SensorEvent \ubb38\uc11c<\/a>\ub97c \ubcf4\uba74, \uac01 \uc13c\uc11c\uc5d0 \ub300\ud574 values\uac00 \uc5b4\ub5a4 \uac12\uc744 \uac16\ub294\uc9c0 \ub098\uc640\uc788\ub2e4. TYPE_ROTATION_VECTOR\uc5d0 \ub300\ud55c \uac12\uc744 \ud655\uc778\ud574\ubcf4\uba74,<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>values[0]: x*sin(\u03b8\/2)<\/li>\n\n\n\n<li>values[1]: y*sin(\u03b8\/2)<\/li>\n\n\n\n<li>values[2]: z*sin(\u03b8\/2)<\/li>\n\n\n\n<li>values[3]: cos(\u03b8\/2)<\/li>\n\n\n\n<li>values[4]: estimated heading Accuracy (in radians) (-1 if unavailable)<\/li>\n<\/ul>\n\n\n\n<p>\uc640 \uac19\uc774 \uac12\uc774 \ub4e4\uc5b4\uc628\ub2e4\uace0 \ud55c\ub2e4. (x, y, z)\uac00 \ubc29\ud5a5\ubca1\ud130\uc774\uace0,  <em>\u03b8<\/em> \uac00 \ud68c\uc804\uac01\uc774\ub2e4. \uc774 Rotation vector\ub294 \ubc14\ub85c \uc0ac\uc6a9\ud558\uae30 \uc5b4\ub824\uc6b4 \ud615\ud0dc\uc774\ub2e4. \uc4f0\uae30\uc27d\uac8c \ubcc0\ud658\uc744 \ud574\uc918\uc57c \ud558\ub294\ub370, \ubcf5\uc7a1\ud55c \uacfc\uc815\uc744 \uc9c1\uc811 \ub2e4 \uacc4\uc0b0\ud560 \ud544\uc694\ub294 \uc5c6\uace0 SensorManager\uc5d0\uc11c \ud544\uc694\ud55c \ud568\uc218\ub4e4\uc744 \uc81c\uacf5\ud574\uc900\ub2e4. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Roll-Pitch-Azimuth<\/h3>\n\n\n\n<p>  \uc0ac\uc6a9 \ud3b8\uc758\uc131\uc744 \uc704\ud574 \uc704\uc5d0\uc11c \ubc1b\uc740 rotation vector\ub97c Roll-Pitch-Azimuth \uac12\uc744 \uac19\ub294 \ubca1\ud130\ub85c \ubcc0\ud658\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. Roll-Pitch-Azimuth\ub294 \uc9c0\uad6c \uc88c\ud45c\uacc4\ub97c \uae30\uc900\uc73c\ub85c \ud3f0\uc758 \ud68c\uc804 \uc0c1\ud0dc\ub97c \ub098\ud0c0\ub0b8\ub2e4. \uc774\uac83\uc740 \ud56d\uacf5\uae30\uc5d0\uc11c Roll-Pitch-Yaw\ub85c \ud56d\uacf5\uae30\uc758 \ud604\uc7ac \uc0c1\ud0dc\ub97c \ud45c\uc2dc\ud558\ub294 \uac83\uacfc \uc720\uc0ac\ud558\ub2e4. \ud56d\uacf5\uae30\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 Roll, Pitch, Yaw 3\uac00\uc9c0 \ud68c\uc804\uc0c1\ud0dc\ub97c \uc774\uc6a9\ud558\uc5ec \ud604\uc7ac \uc0c1\ud0dc\ub97c \ub098\ud0c0\ub0b8\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"392\" height=\"279\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/11\/AttitudePlane.png\" alt=\"\" class=\"wp-image-1287\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/11\/AttitudePlane.png 392w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/11\/AttitudePlane-300x214.png 300w\" sizes=\"auto, (max-width: 392px) 100vw, 392px\" \/><\/figure>\n<\/div>\n\n\n<p>Roll-Pitch-Azimuth\ub3c4 Roll-Pitch-Yaw\uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Yaw\uac00 +Z\ucd95 \ubc29\ud5a5\uc774\ub77c\uba74, Azimuth\ub294 -Z\ucd95 \ubc29\ud5a5\uc774\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"530\" height=\"370\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/11\/roll-pitch-azimuth.jpg\" alt=\"\" class=\"wp-image-1288\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/11\/roll-pitch-azimuth.jpg 530w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/11\/roll-pitch-azimuth-300x209.jpg 300w\" sizes=\"auto, (max-width: 530px) 100vw, 530px\" \/><\/figure>\n<\/div>\n\n\n<p>\uae30\uc900 \uc88c\ud45c\uacc4\ub294 \uc55e\uc5d0\uc11c \ub9d0\ud55c \uc9c0\uad6c\uc88c\ud45c\uacc4\ub97c \ucc38\uace0\ud558\uc790. \uc989, Y \ubc29\ud5a5\uc774 \ubd81\ucabd\uc774\ub2e4. -Z\ub97c \uc624\ub978\uc190\uc73c\ub85c \uac10\uc544\ubcf4\uba74 \uc2dc\uacc4\ubc29\ud5a5 \ud68c\uc804\uc774 \ub418\ub294\ub370, \uc774\uac83\uc774 \ubc14\ub85c \ubc29\uc704\uac01\uc774\uba70, \uadf8\ub798\uc11c Yaw\ub780 \ud45c\ud604\ub300\uc2e0 Azimuth(\ubc29\uc704\uac01)\ub780 \ud45c\ud604\uc744 \uc4f0\uace0 \uc788\ub2e4. <\/p>\n\n\n\n<p>\uadf8\ub7ec\uba74, rotation vector\ub85c\ubd80\ud130 Roll-Pitch-Azimuth\uac12\uc73c\ub85c \ubcc0\ud658\ud574\ubcf4\uc790. <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#getRotationMatrixFromVector(float[],%20float[])\">getRotationMatrixFromVector()<\/a> \uc640 <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#getOrientation(float[],%20float[])\">getOrientation() <\/a>\ud568\uc218\uac00 \uc4f0\uc778\ub2e4. \uc608\uc81c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val rotationMatrix = FloatArray(16)\nSensorManager.getRotationMatrixFromVector(rotationMatrix, event.values)\nval orientation = FloatArray(3)\nSensorManager.getOrientation(rotationMatrix, orientation)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> rotationMatrix <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">FloatArray<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">16<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">SensorManager.<\/span><span style=\"color: #DCBDFB\">getRotationMatrixFromVector<\/span><span style=\"color: #ADBAC7\">(rotationMatrix, event.values)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> orientation <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">FloatArray<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">SensorManager.<\/span><span style=\"color: #DCBDFB\">getOrientation<\/span><span style=\"color: #ADBAC7\">(rotationMatrix, orientation)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc8fc\uc758\ud574\uc57c \ud560 \uac83\uc740 getRotationMatrixFromVector()\uc5d0\uc11c \ubca1\ud130 \ud68c\uc804\uc758 \ub9e4\ud2b8\ub9ad\uc2a4 \ud45c\ud604\uc778 rotationMatrix\ub97c \ubc1b\uc544\uc62c \ub54c, \uadf8 \ud06c\uae30\uac00 16\uc774\ub77c\ub294 \uc810\uc774\ub2e4. \ubb38\uc11c\ub97c \ubcf4\uba74, 9~16 \uac12\uc774\ub77c\uace0 \ub418\uc5b4\uc788\uc9c0\ub9cc, \uc120\ud615\ub300\uc218\uc5d0 \ub098\uc624\ub4ef\uc774 4X4 \ub9e4\ud2b8\ub9ad\uc2a4, \uc989 16\uac1c\uc758 \ubc30\uc5f4\uc744 \uc368\uc57c \uc644\uc804\ud55c \ud45c\ud604\uc774 \uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n\n<p>\uc774\ub807\uac8c \uc5bb\uc5b4\uc628 rotationMatrix\ub97c getOrientation()\ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec orientation vector\ub97c \uc5bb\uc5b4\uc624\uace0 \uc788\ub2e4. <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/SensorManager#getOrientation(float[],%20float[])\">getOrientation()<\/a> \ubb38\uc11c\ub97c \ubcf4\uba74, \ubca1\ud130\uc758 \uac01 \uac12\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>orientation[0] : Azimuth, -Z\ucd95 \uc911\uc2ec \ud68c\uc804\uac01, \u00a0\uac12\uc758 \ubc94\uc704\ub294 -\u03c0 \ubd80\ud130 \u00a0\u03c0 \uae4c\uc9c0<\/li>\n\n\n\n<li>orientation[1] : Pitch, X\ucd95 \uc911\uc2ec \ud68c\uc804\uac01, \uac12\uc758 \ubc94\uc704\ub294 -\u03c0 \ubd80\ud130 \u00a0\u03c0 \uae4c\uc9c0<\/li>\n\n\n\n<li>orientation[2] : Roll, Y\ucd95 \uc911\uc2ec \ud68c\uc804\uac01, \uac12\uc758 \ubc94\uc704\ub294 -\u03c0 \ubd80\ud130 \u00a0\u03c0 \uae4c\uc9c0<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uad6c\uae00 \ub9f5\uc758 Bearing\uac12\uc744 \uc790\ub3d9\uc73c\ub85c<\/h3>\n\n\n\n<p>\uc774\uc81c \uc6d0\ud558\ub294 \uac12\uc744 \uc5bb\uc5c8\ub2e4. \uadf8\ub7fc \uc774\uac78 \uc5b4\ub514\uc5d0 \uc774\uc6a9\ud560\uae4c? \uccab\ubc88\uc9f8 \uc6a9\ub3c4\ub294 \uad6c\uae00\ub9f5\uacfc \uac19\uc740 \ub9f5\uc758 \uc790\ub3d9 \ud68c\uc804\uc5d0 \uc4f8 \uc218 \uc788\ub2e4. \uba3c\uc800 \uad6c\uae00\ub9f5\uc758 \uce74\uba54\ub77c\uac00 \uc9c0\ub3c4\ub97c \uc5b4\ub5bb\uac8c \ubc14\ub77c\ubcf4\ub294\uc9c0 \uc54c\uc544\ubcf4\uc790. <a href=\"https:\/\/developers.google.com\/maps\/documentation\/android-sdk\/views\">\uad6c\uae00\ub9f5 \ubb38\uc11c<\/a>\ub97c \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uadf8\ub9bc\uc744 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"677\" height=\"582\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2021\/11\/googlemap_camera.png\" alt=\"\" class=\"wp-image-1289\" style=\"width:677px;height:582px\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/11\/googlemap_camera.png 677w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2021\/11\/googlemap_camera-300x258.png 300w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/figure>\n<\/div>\n\n\n<p>\uadf8\ub9bc\uc744 \ubcf4\uba74, bearing\uc774 \ubc14\ub85c \ubc29\uc704\uac01, Azimuth\uc640 \uc77c\uce58\ud558\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4. \ub2e4\ub9cc, \uc55e\uc5d0\uc11c \uc5bb\uc5b4\uc628 \uac12\uc740 radian\uac12\uc774\ubbc0\ub85c degree\ub85c \ubcc0\ud658\ud574\uc918\uc57c \ud55c\ub2e4. Math.toDegrees()\ub97c \uc774\uc6a9\ud558\uba74\ub41c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val orientationDeg = FloatArray(3)\n\norientation.forEachIndexed { index, element ->\n    orientationDeg&#91;index&#93; = Math.toDegrees(element.toDouble()).toFloat()\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> orientationDeg <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">FloatArray<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">orientation.<\/span><span style=\"color: #DCBDFB\">forEachIndexed<\/span><span style=\"color: #ADBAC7\"> { index, element <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    orientationDeg&#91;index&#93; <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Math.<\/span><span style=\"color: #DCBDFB\">toDegrees<\/span><span style=\"color: #ADBAC7\">(element.<\/span><span style=\"color: #DCBDFB\">toDouble<\/span><span style=\"color: #ADBAC7\">()).<\/span><span style=\"color: #DCBDFB\">toFloat<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Azimuth\uac00 -180( <span style=\"font-size: revert; color: initial;\">-\u03c0<\/span> ) \ubd80\ud130 180( <span style=\"font-size: revert; color: initial;\">\u03c0<\/span> )\ub3c4\uc758 \ubc94\uc704\ub97c \uac00\uc9c0\ubbc0\ub85c \uc774\uac78 0-360\ub3c4\ub85c \uc26c\ud504\ud2b8 \uc2dc\ucf1c\uc918\uc57c\ud55c\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val bearing: Float = ((orientationDeg&#91;0&#93; + declination + 360f)%360)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> bearing: <\/span><span style=\"color: #F69D50\">Float<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> ((orientationDeg&#91;<\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">&#93; <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> declination <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">360f<\/span><span style=\"color: #ADBAC7\">)<\/span><span style=\"color: #F47067\">%<\/span><span style=\"color: #6CB6FF\">360<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\ub807\uac8c \ubcc0\uacbd\ud55c bearing \uac12\uc744 googlemap camera\uc5d0 \uc801\uc6a9\ud55c\ub2e4. \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val position: CameraPosition = CameraPosition.Builder()\n        .target(googleMap.cameraPosition.target)\n        .zoom(googleMap.cameraPosition.zoom)\n        .tilt(googleMap.cameraPosition.tilt)\n        .bearing(bearing)\n        .build()\ngoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(position))<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> position: <\/span><span style=\"color: #F69D50\">CameraPosition<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> CameraPosition.<\/span><span style=\"color: #DCBDFB\">Builder<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">target<\/span><span style=\"color: #ADBAC7\">(googleMap.cameraPosition.target)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">zoom<\/span><span style=\"color: #ADBAC7\">(googleMap.cameraPosition.zoom)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">tilt<\/span><span style=\"color: #ADBAC7\">(googleMap.cameraPosition.tilt)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">bearing<\/span><span style=\"color: #ADBAC7\">(bearing)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">build<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">googleMap.<\/span><span style=\"color: #DCBDFB\">animateCamera<\/span><span style=\"color: #ADBAC7\">(CameraUpdateFactory.<\/span><span style=\"color: #DCBDFB\">newCameraPosition<\/span><span style=\"color: #ADBAC7\">(position))<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uad6c\uae00 \ub9f5 \uad00\ub828 \uc791\uc5c5\uc740 \uc0dd\ub7b5\ub418\uc5b4 \uc788\ub294\ub370, googleMap\uc774 \ubc14\ub85c \uad6c\uae00\ub9f5 \uac1d\uccb4\uc774\ub2e4. \uce74\uba54\ub77c\uc758 \ub2e4\ub978 \uac12\ub4e4\uc740 \uae30\uc874\uc5d0 googleMap\uc5d0  \uc788\ub294 \uac12\ub4e4\uc744 \uc720\uc9c0\ud558\uace0 bearing\uac12\ub9cc \uc0c8\ub85c \ub123\uc5c8\ub2e4. \uc774\ub807\uac8c\ud558\uba74, \ub2e4\ub978 \ub9f5 \uc571\ub4e4\ucc98\ub7fc \ud3f0\uc758 \ubc29\ud5a5\uc5d0 \ub530\ub77c \uc9c0\ub3c4\ub97c \ud68c\uc804 \uc2dc\ud0ac \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub098\uce68\ubc18(Compass)\uc5d0 \uc801\uc6a9\ud574\ubcf4\uc790<\/h3>\n\n\n\n<p> \ud558\ub2e4\ubcf4\ub2c8 \uc790\uc5f0\uc2a4\ub7fd\uac8c \ub098\uce68\ubc18\uc740 \ub530\ub77c\uc624\uac8c \ub41c\ub2e4. \uc55e\uc5d0\uc11c \uad6c\uae00\ub9f5\uc5d0\uc11c \uc791\uc5c5\ud55c \uac83\uacfc \ub3d9\uc77c\ud558\ub2e4. \uc911\ubcf5\uc774\uc9c0\ub9cc, \ucf54\ub4dc\ub97c \uc368\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val orientationDeg = FloatArray(3)\n\norientation.forEachIndexed { index, element ->\n    orientationDeg&#91;index&#93; = Math.toDegrees(element.toDouble()).toFloat()\n}\n\nval azimuthCorrectFloat: Float = ((orientationDeg&#91;0&#93; + 360f)%360)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> orientationDeg <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">FloatArray<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">orientation.<\/span><span style=\"color: #DCBDFB\">forEachIndexed<\/span><span style=\"color: #ADBAC7\"> { index, element <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    orientationDeg&#91;index&#93; <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Math.<\/span><span style=\"color: #DCBDFB\">toDegrees<\/span><span style=\"color: #ADBAC7\">(element.<\/span><span style=\"color: #DCBDFB\">toDouble<\/span><span style=\"color: #ADBAC7\">()).<\/span><span style=\"color: #DCBDFB\">toFloat<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> azimuthCorrectFloat: <\/span><span style=\"color: #F69D50\">Float<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> ((orientationDeg&#91;<\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">&#93; <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">360f<\/span><span style=\"color: #ADBAC7\">)<\/span><span style=\"color: #F47067\">%<\/span><span style=\"color: #6CB6FF\">360<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucd94\uac00\ub85c \uc791\uc5c5\ud560 \ubd80\ubd84\uc740 \ubc14\ub85c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Magnetic_declination\">\uc9c0\uc790\uae30 \ud3b8\uac01<\/a> (declination)\uc774\ub2e4. \uc790\uae30\uc7a5 \ubd81\uadf9\uacfc \uc2e4\uc81c \uc9c0\uad6c\uc758 \ubd81\uadf9\uc774 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uadf8 \ucc28\uc774\uac01\uc774 \ud3b8\uac01\uc774\ub2e4. \ub098\uce68\ubc18\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74, \uc774 \uac12\uc744 \ubcf4\uc815\ud574\uc904 \ud544\uc694\uac00 \uc788\ub2e4. \ubb38\uc81c\ub294 \ud3b8\uac01\uc774 \uc704\uce58\uc640 \uc2dc\uac04\uc5d0 \ub530\ub77c \ud56d\uc0c1 \ubcc0\ud654\ud55c\ub2e4\ub294 \uac83\uc778\ub370, \uadf8 \ubcc0\ud654\uac00 \ud06c\uc9c4 \uc54a\uc544\uc11c \ub808\ud37c\ub7f0\uc2a4 \uac12\uc744 \uc0ac\uc6a9\ud574\ub3c4 \uc218\ub144\uac04 \ud070 \ubb38\uc81c\ub294 \uc5c6\ub2e4\uace0 \ud55c\ub2e4. \uc5b4\uca0c\ub4e0, \uadf8 \ub808\ud37c\ub7f0\uc2a4 \uac12\ub3c4 \uacbd\ub3c4, \uc704\ub3c4, \uace0\ub3c4, \uc2dc\uac04\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\ub294\ub370, \uc8fc\uae30\uc801\uc73c\ub85c <a href=\"https:\/\/www.ngdc.noaa.gov\/geomag\/WMM\/DoDWMM.shtml\">WMM(World Magnetic Model)\uc774\ub780\uac8c \ubc1c\ud589<\/a>\ub418\uace0 \uc774 \ud45c\ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc120 GeomagneticField \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ub97c \uc81c\uacf5\ud558\uace0 \uc788\ub2e4. <a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/GeomagneticField\">GeomagneticField \ubb38\uc11c<\/a>\ub97c \ubcf4\uba74, \ud604\uc7ac\ub294 WMM-2020\uc774 \uc0ac\uc6a9\ub418\uace0 \uc788\ub2e4\uace0 \ud55c\ub2e4.<\/p>\n\n\n\n<p>location \uc815\ubcf4\ub97c \uac00\uc838\uc624\ub294 \uacbd\uc6b0\ub294 \ud604\uc7ac \uc704\uce58\uac12\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uac00\uc7a5 \uc815\ud655\ud558\ub2e4. \ub2e4\ub9cc, \ud55c \uc9c0\uc5ed\uc5d0\uc11c \ud06c\uac8c \ubcc0\ud558\ub294 \uac12\uc774 \uc544\ub2c8\ubbc0\ub85c \uc608\uc81c\uc5d0\uc11c\ub294 \uc11c\uc6b8\uc758 \uc911\uc2ec\uac12\uc744 \uc774\uc6a9\ud588\ub2e4. \uc608\uc81c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>object ApplicationConstants {\n    const val SEOUL_LATITUDE = 37.566535\n    const val SEOUL_LONGITUDE = 126.9779692\n    const val SEOULT_ALTITUDE = 38.0\n}\n...\nval declination = GeomagneticField(ApplicationConstants.SEOUL_LATITUDE.toFloat(),\n    ApplicationConstants.SEOUL_LONGITUDE.toFloat(),\n    ApplicationConstants.SEOULT_ALTITUDE.toFloat(),\n    System.currentTimeMillis()).declination\n\n...\nval azimuthCorrectFloat: Float = ((orientationDeg&#91;0&#93; + declination + 360f)%360)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">object<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ApplicationConstants<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">const<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> SEOUL_LATITUDE <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">37.566535<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">const<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> SEOUL_LONGITUDE <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">126.9779692<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">const<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> SEOULT_ALTITUDE <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">38.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> declination <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">GeomagneticField<\/span><span style=\"color: #ADBAC7\">(ApplicationConstants.SEOUL_LATITUDE.<\/span><span style=\"color: #DCBDFB\">toFloat<\/span><span style=\"color: #ADBAC7\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    ApplicationConstants.SEOUL_LONGITUDE.<\/span><span style=\"color: #DCBDFB\">toFloat<\/span><span style=\"color: #ADBAC7\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    ApplicationConstants.SEOULT_ALTITUDE.<\/span><span style=\"color: #DCBDFB\">toFloat<\/span><span style=\"color: #ADBAC7\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    System.<\/span><span style=\"color: #DCBDFB\">currentTimeMillis<\/span><span style=\"color: #ADBAC7\">()).declination<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> azimuthCorrectFloat: <\/span><span style=\"color: #F69D50\">Float<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> ((orientationDeg&#91;<\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">&#93; <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> declination <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">360f<\/span><span style=\"color: #ADBAC7\">)<\/span><span style=\"color: #F47067\">%<\/span><span style=\"color: #6CB6FF\">360<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucf54\ub4dc\ub97c \ubcf4\uba74, GeomagneticField() \uc0dd\uc131\uc790\uc5d0 \uc11c\uc6b8\uc758 \uacbd\ub3c4, \uc704\ub3c4, \uace0\ub3c4\ub97c \ub123\uc5c8\uace0, \uc2dc\uac04\uc740 \uc2dc\uc2a4\ud15c \ud604\uc7ac \uc2dc\uac04\uc744 \uac00\uc838\uc640 \ub123\uc5b4\uc92c\ub2e4. \uc774\ub807\uac8c \uc0dd\uc131\ud574\uc11c declination\uac12\uc744 \uac00\uc838\uc654\ub2e4.<\/p>\n\n\n\n<p>\ubc29\uc704\uac01\uc758 \uacc4\uc0b0\uc740 \uc55e\uc11c \uad6c\uae00\ub9f5\uc5d0\uc11c \ud55c \uac83\uacfc \ub3d9\uc77c\ud558\ub098, \ucd5c\uc885 \uac12\uc744 \uacc4\uc0b0\ud560 \ub54c \uc774 declination\uc744 \ub354\ud574\uc92c\ub2e4. \uc11c\uc6b8\uc758 \uacbd\uc6b0 \uc11c\ucabd\uc73c\ub85c \uce58\uc6b0\uce5c \ub300\ub7b5 -8\ub3c4\uc815\ub3c4\uac00 \ub098\uc628\ub2e4. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ub9c8\ubb34\ub9ac<\/h3>\n\n\n\n<p> \uc13c\uc11c\uc758 \uc0ac\uc6a9\uacfc TYPE_ROTATION_VECTOR\uc5d0 \ud544\uc694\ud55c \uc815\ubcf4\ub294 \ucda9\ubd84\ud788 \uc801\uc5c8\ub2e4\uace0 \uc0dd\uac01\ud558\uc9c0\ub9cc, \uadf8\ub0e5 \uc0dd\uac01\ub098\ub294\uac70 \uc880 \ub354 \uc801\uc5b4\ubcf8\ub2e4. <\/p>\n\n\n\n<p>\ub098\uce68\ubc18\uc744 \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uac80\uc0c9\ud574\ubcf4\uba74 TYPE_ROTATION_VECTOR \ub9d0\uace0\ub3c4 TYPE_ACCELEROMETER \uc640 TYPE_MAGNETIC_FIELD \ub97c \uc870\ud569\ud558\ub294 \ubc29\ubc95\uc774 \ub098\uc640\uc788\ub2e4. \uc870\uae08 \ub2e4\ub974\uc9c0\ub9cc, \ubc30\uacbd \uc9c0\uc2dd\uc740 \ud06c\uac8c \ub2e4\ub974\uc9c0 \uc54a\ub2e4. <\/p>\n\n\n\n<p>\uc124\uba85\ud558\ub294 \uc21c\uc11c\uc0c1, \ud3b8\uac01\uc744 \ub098\uce68\ubc18 \ubd80\ubd84\uc5d0\uc11c\ub9cc \ub2e4\ub918\ub294\ub370, \uad6c\uae00\ub9f5\uc5d0\ub3c4 \uc801\uc6a9\ud558\uba74 \ub2f9\uc5f0\ud788 \ub354 \uc815\ud655\ud574\uc9c4\ub2e4. \uad6c\uae00\ub9f5\uc5d0\uc120 \uc704\uce58\uc815\ubcf4\ub3c4 \uc2e4\uc2dc\uac04\uc73c\ub85c \ub4e4\uc5b4\uc624\ub2c8\uae4c \uc0ac\uc6a9\ud558\uae30 \ub354 \uc26c\uc6b8 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<p>\ucf54\ub4dc\ub85c \uad6c\ud604\ud558\uc9c0 \uc54a\uc740 \ubd80\ubd84\uc774 onAccuracyChanged() \ubd80\ubd84\uc778\ub370, \uc9c1\uc811 \ud574\ubcf4\uae30 \ubc14\ub780\ub2e4. \ucc98\uc74c\uc5d0 \ud560 \ub54c \uac10\ub3c4\uac00 \ub0ae\uc74c\uc774 \ub098\uc654\ub294\ub370, \ud55c \ubc88 8\uc790\ub85c \ub3cc\ub9ac\ub294 \ubcf4\uc815\uc744 \ud558\uace0\ub098\uc11c \uc9d1\uc5d0\uc11c\ub294 \uacc4\uc18d \uc88b\uc74c\uc774 \ub728\uace0 \uc788\ub2e4. \uc774\ubd80\ubd84\uc740 \ub098\ub3c4 \uc5ec\ub7ec\uac00\uc9c0\ub85c \ub354 \ud14c\uc2a4\ud2b8\ub97c \ud574\ubd10\uc57c \ud560\uac70 \uac19\ub2e4. \uc624\ub7ab\ub9cc\uc5d0 \uae38\uace0\uae34 \ud3ec\uc2a4\ud305\uc774\uc5c8\ub294\ub370, \uadf8\ub798\ub3c4 \ub2e4\ub904\uc57c\ud560\uac70 \ub2e4 \ub2e4\ub8ec\uac70 \uac19\uc544\uc11c \ud6c4\ub828\ud568. \uc218\uace0.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc0ac\uc2e4, \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc13c\uc11c\ub97c \uc774\uc6a9\ud55c \uad6c\ud604\uc744 \uc774\uc804\uc5d0 \ud574\ubcf4\uc9c0 \ubabb\ud588\ub2e4. \uc774\ubc88\uc5d0 \ud544\uc694\ud55c \uae30\ud68c\uac00 \uc0dd\uaca8\uc11c \uc54c\uc544\ubcf4\ub294 \uae40\uc5d0 \uc815\ub9ac\ub97c \ud558\uae30\ub85c \ub9c8\uc74c\uba39\uc5c8\ub2e4. \uc13c\uc11c\ub77c\ub294\uac8c \uc885\ub958\ub3c4 \ub9ce\uace0, \uae30\uae30\ub9c8\ub2e4 \ub2ec\ub824\uc788\ub294 \uac83\ub3c4 \ub2e4\ub974\uace0, \uac01\uac01 \uc8fc\uc5b4\uc9c0\ub294 \ub370\uc774\ud130\ub3c4 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \ubaa8\ub4e0\uac78 \ub2e4\ub8f0 \uc218\ub294 \uc5c6\uc744\uac70 \uac19\uace0, \uae30\ubcf8\uc801\uc73c\ub85c \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c SensorManager\ub97c \ud1b5\ud574 \uc13c\uc11c\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95, \uadf8 \uc911\uc5d0\uc11c TYPE_ROTATION_VECTOR\ub97c \uc774\uc6a9\ud574 \ub098\uce68\ubc18\uacfc \uac19\uc740\uac78 \ub9cc\ub4e4\uc5b4 \ubcf4\ub824\ud55c\ub2e4. \uc13c\uc11c\uc758 <a href=\"http:\/\/batmask.net\/index.php\/2021\/11\/17\/1257\/\" class=\"btn btn-link continue-link\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,34],"tags":[186,258,256,257,254,255],"class_list":["post-1257","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-android-2","tag-bearing","tag-compass","tag-googlemap","tag-sensor","tag-type_rotation_vector"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=1257"}],"version-history":[{"count":31,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1257\/revisions"}],"predecessor-version":[{"id":3478,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1257\/revisions\/3478"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=1257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=1257"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=1257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}