[{"data":1,"prerenderedAt":3254},["ShallowReactive",2],{"navigation":3,"posts-undefined-Android-0-999":20},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",[21,303,1433,2032,2720,2847,2941,3231],{"id":22,"title":23,"body":24,"class":283,"cover":284,"coverSize":283,"date":285,"description":30,"draft":286,"extension":287,"hideComments":286,"location":283,"meta":288,"navigation":289,"path":290,"readingTime":291,"seo":296,"sitemap":297,"stem":298,"tags":299,"time":283,"weather":283,"__hash__":302},"posts\u002Fposts\u002F2021\u002F20210105.fastboot-failed-remote-operation-not-permitted.md","fastboot FAILED (remote: Operation not permitted) 的问题",{"type":25,"value":26,"toc":281},"minimark",[27,31,39,250,257,260,263,266,274,277],[28,29,30],"p",{},"这两天买了台安卓测试设备，由于我们的项目需要系统签名，所以不得不重新刷系统。",[28,32,33,34,38],{},"在 ",[35,36,37],"code",{},"fastboot flash system"," 的时候，每次都在最后要完成的时候报一个错误：",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-log shiki shiki-themes material-theme-lighter github-light github-dark","target reported max download size of 536870912 bytes\nSending sparse 'system' 1\u002F4 (524284 KB)...\nOKAY [ 15.543s]\nWriting 'system' 1\u002F4...\nOKAY [  3.548s]\nSending sparse 'system' 2\u002F4 (524284 KB)...\nOKAY [ 15.483s]\nWriting 'system' 2\u002F4...\nOKAY [  3.644s]\nSending sparse 'system' 3\u002F4 (524284 KB)...\nOKAY [ 15.103s]\nWriting 'system' 3\u002F4...\nFAILED (remote: Operation not permitted)\nFinished. Total time: 58.650s\n","log","",[35,47,48,64,91,103,120,132,152,162,177,187,207,217,232,238],{"__ignoreMap":45},[49,50,53,57,61],"span",{"class":51,"line":52},"line",1,[49,54,56],{"class":55},"su5hD","target reported max download size of ",[49,58,60],{"class":59},"s39Yj","536870912",[49,62,63],{"class":55}," bytes\n",[49,65,67,70,74,77,79,82,85,88],{"class":51,"line":66},2,[49,68,69],{"class":55},"Sending sparse ",[49,71,73],{"class":72},"s_sjI","'system'",[49,75,76],{"class":59}," 1",[49,78,6],{"class":55},[49,80,81],{"class":59},"4",[49,83,84],{"class":55}," (",[49,86,87],{"class":59},"524284",[49,89,90],{"class":55}," KB)...\n",[49,92,94,97,100],{"class":51,"line":93},3,[49,95,96],{"class":55},"OKAY [ ",[49,98,99],{"class":59},"15",[49,101,102],{"class":55},".543s]\n",[49,104,106,109,111,113,115,117],{"class":51,"line":105},4,[49,107,108],{"class":55},"Writing ",[49,110,73],{"class":72},[49,112,76],{"class":59},[49,114,6],{"class":55},[49,116,81],{"class":59},[49,118,119],{"class":55},"...\n",[49,121,123,126,129],{"class":51,"line":122},5,[49,124,125],{"class":55},"OKAY [  ",[49,127,128],{"class":59},"3",[49,130,131],{"class":55},".548s]\n",[49,133,135,137,139,142,144,146,148,150],{"class":51,"line":134},6,[49,136,69],{"class":55},[49,138,73],{"class":72},[49,140,141],{"class":59}," 2",[49,143,6],{"class":55},[49,145,81],{"class":59},[49,147,84],{"class":55},[49,149,87],{"class":59},[49,151,90],{"class":55},[49,153,155,157,159],{"class":51,"line":154},7,[49,156,96],{"class":55},[49,158,99],{"class":59},[49,160,161],{"class":55},".483s]\n",[49,163,165,167,169,171,173,175],{"class":51,"line":164},8,[49,166,108],{"class":55},[49,168,73],{"class":72},[49,170,141],{"class":59},[49,172,6],{"class":55},[49,174,81],{"class":59},[49,176,119],{"class":55},[49,178,180,182,184],{"class":51,"line":179},9,[49,181,125],{"class":55},[49,183,128],{"class":59},[49,185,186],{"class":55},".644s]\n",[49,188,190,192,194,197,199,201,203,205],{"class":51,"line":189},10,[49,191,69],{"class":55},[49,193,73],{"class":72},[49,195,196],{"class":59}," 3",[49,198,6],{"class":55},[49,200,81],{"class":59},[49,202,84],{"class":55},[49,204,87],{"class":59},[49,206,90],{"class":55},[49,208,210,212,214],{"class":51,"line":209},11,[49,211,96],{"class":55},[49,213,99],{"class":59},[49,215,216],{"class":55},".103s]\n",[49,218,220,222,224,226,228,230],{"class":51,"line":219},12,[49,221,108],{"class":55},[49,223,73],{"class":72},[49,225,196],{"class":59},[49,227,6],{"class":55},[49,229,81],{"class":59},[49,231,119],{"class":55},[49,233,235],{"class":51,"line":234},13,[49,236,237],{"class":55},"FAILED (remote: Operation not permitted)\n",[49,239,241,244,247],{"class":51,"line":240},14,[49,242,243],{"class":55},"Finished. Total time: ",[49,245,246],{"class":59},"58",[49,248,249],{"class":55},".650s\n",[28,251,252,253,256],{},"不管怎么 ",[35,254,255],{},"-S"," 给多少，最后总在 70% 左右的时候报这个错，网上的资料也是查不到。",[28,258,259],{},"后来想，会不会和 system 分区大小有关，尝试了半天又没结果。",[28,261,262],{},"最终下了个最新版的 platform-tools，解决了。问题确实是 system 分区大小的问题，最新版的 fastboot 在烧录前会自动调整 system 分区大小。",[28,264,265],{},"附个最新版 platform-tools 的下载地址：",[28,267,268],{},[269,270,271],"a",{"href":271,"rel":272},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Freleases\u002Fplatform-tools",[273],"nofollow",[28,275,276],{},"记录一下，方便后人。如果帮助到你的话，留个言再走吧。",[278,279,280],"style",{},"html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":45,"searchDepth":66,"depth":66,"links":282},[],null,"png","2021-01-05",false,"md",{},true,"\u002Fposts\u002F2021\u002Ffastboot-failed-remote-operation-not-permitted",{"text":292,"minutes":293,"time":294,"words":295},"2 min read",1.24,74400,248,{"title":23,"description":30},{"loc":290},"posts\u002F2021\u002F20210105.fastboot-failed-remote-operation-not-permitted",[300,301],"技术","Android","YV00Q09feWoUxyWhCUlxF32Tk1GXdjRSj33StuPrWdo",{"id":304,"title":305,"body":306,"class":283,"cover":284,"coverSize":283,"date":1420,"description":310,"draft":286,"extension":287,"hideComments":286,"location":283,"meta":1421,"navigation":289,"path":1422,"readingTime":1423,"seo":1428,"sitemap":1429,"stem":1430,"tags":1431,"time":283,"weather":283,"__hash__":1432},"posts\u002Fposts\u002F2020\u002F20201218.android-webview-picture-cache.md","安卓 WebView 图片离线缓存方案",{"type":25,"value":307,"toc":1418},[308,311,314,317,342,345,1415],[28,309,310],{},"有这样一个项目，UI 渲染全部由 WebView 来完成，套个安卓的壳，壳子里面做一些和硬件交互的功能，例如摄像头、麦克风等。WebView 加载的页面走的本地打包的文件。不过 WebView 中的图片等资源走的是网络访问。",[28,312,313],{},"为了减少网络访问的流量，以及提升在弱网络或无网络情况下的体验，需要对网络访问的图片进行本地缓存。",[28,315,316],{},"原先采用的是 WebView 自带的缓存机制来实现，但并不可靠，于是需要通过拦截网络请求，通过本地缓存干预的方式来实现。具体原理如下：",[318,319,320,328,339],"ol",{},[321,322,323,324,327],"li",{},"通过 ",[35,325,326],{},"shouldInterceptRequest"," 拦截请求，判断是否是访问网络图片，如果是则进行干预",[321,329,330,331,334,335,338],{},"取请求地址的 ",[35,332,333],{},"md5"," 值加图片文件扩展名组成的文件名，拼接 ",[35,336,337],{},"cache"," 目录获得一个本地资源地址，判断该资源是否存在，若存在则直接返回该资源",[321,340,341],{},"若该资源不存在，说明是首次访问，则将该网络图片下载到该地址下，并返回该资源",[28,343,344],{},"具体代码如下：",[40,346,350],{"className":347,"code":348,"language":349,"meta":45,"style":45},"language-kotlin shiki shiki-themes material-theme-lighter github-light github-dark","import android.content.Context\nimport android.net.http.SslError\nimport android.webkit.*\nimport androidx.webkit.WebViewAssetLoader\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.math.BigInteger\nimport java.net.HttpURLConnection\nimport java.net.URL\nimport java.security.MessageDigest\n\nclass CommonWebClient(context: Context) : WebViewClient() {\n    private var assetLoader: WebViewAssetLoader = WebViewAssetLoader.Builder()\n            .addPathHandler(\"\u002Fassets\u002F\", WebViewAssetLoader.AssetsPathHandler(context))\n            .build()\n\n    private fun md5(input: String): String {\n        return BigInteger(1, MessageDigest.getInstance(\"MD5\").digest(input.toByteArray())).toString(16).padStart(32, '0')\n    }\n\n    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {\n        return true\n    }\n\n    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {\n        return request?.url?.let { url ->\n            val urlString = url.toString()\n            if (!urlString.contains(\"appassets.androidplatform.net\") && urlString.contains(\"aliyuncs.com\")) {\n                try {\n                    var extension = urlString.substring(urlString.lastIndexOf(\".\"))\n                    if (extension.lastIndexOf(\"?\") > -1) {\n                        extension = extension.substring(0, extension.lastIndexOf(\"?\"))\n                    }\n                    val fileName = \"${md5(urlString)}${extension}\"\n                    val file = File(view?.context?.externalCacheDir, fileName)\n                    if (!file.exists()) {\n                        val conn = URL(urlString).openConnection() as HttpURLConnection\n                        conn.connectTimeout = 5000\n                        conn.requestMethod = \"GET\"\n                        conn.doInput = true\n                        if (conn.responseCode == 200) {\n                            val fos = FileOutputStream(file)\n                            val buffer = ByteArray(1024)\n                            var len = 0\n                            while (conn.inputStream.read(buffer).also { len = it } != -1) {\n                                fos.write(buffer, 0, len)\n                            }\n                            conn.inputStream.close()\n                            fos.close()\n                        }\n                    }\n                    WebResourceResponse(MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension), \"UTF-8\", file.inputStream())\n                } catch (ex: Exception) {\n                    assetLoader.shouldInterceptRequest(url)\n                }\n            } else {\n                val response = assetLoader.shouldInterceptRequest(url)\n                if (url.path?.endsWith(\".js\") == true && response != null) {\n                    response.mimeType = \"text\u002Fjavascript\"\n                }\n                response\n            }\n        }\n    }\n\n    override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {\n        handler?.proceed()\n        super.onReceivedSslError(view, handler, error)\n    }\n}\n","kotlin",[35,351,352,362,369,380,387,394,401,408,415,422,429,434,457,485,508,518,523,548,617,623,628,657,666,671,676,705,722,741,782,790,820,849,878,884,920,936,954,983,994,1005,1015,1032,1049,1069,1083,1118,1135,1141,1152,1162,1168,1173,1206,1223,1234,1240,1251,1269,1305,1316,1321,1327,1333,1339,1344,1349,1378,1389,1404,1409],{"__ignoreMap":45},[49,353,354,358],{"class":51,"line":52},[49,355,357],{"class":356},"smGrS","import",[49,359,361],{"class":360},"sbgvK"," android.content.Context\n",[49,363,364,366],{"class":51,"line":66},[49,365,357],{"class":356},[49,367,368],{"class":360}," android.net.http.SslError\n",[49,370,371,373,376],{"class":51,"line":93},[49,372,357],{"class":356},[49,374,375],{"class":360}," android.webkit.",[49,377,379],{"class":378},"s_hVV","*\n",[49,381,382,384],{"class":51,"line":105},[49,383,357],{"class":356},[49,385,386],{"class":360}," androidx.webkit.WebViewAssetLoader\n",[49,388,389,391],{"class":51,"line":122},[49,390,357],{"class":356},[49,392,393],{"class":360}," java.io.File\n",[49,395,396,398],{"class":51,"line":134},[49,397,357],{"class":356},[49,399,400],{"class":360}," java.io.FileOutputStream\n",[49,402,403,405],{"class":51,"line":154},[49,404,357],{"class":356},[49,406,407],{"class":360}," java.math.BigInteger\n",[49,409,410,412],{"class":51,"line":164},[49,411,357],{"class":356},[49,413,414],{"class":360}," java.net.HttpURLConnection\n",[49,416,417,419],{"class":51,"line":179},[49,418,357],{"class":356},[49,420,421],{"class":360}," java.net.URL\n",[49,423,424,426],{"class":51,"line":189},[49,425,357],{"class":356},[49,427,428],{"class":360}," java.security.MessageDigest\n",[49,430,431],{"class":51,"line":209},[49,432,433],{"emptyLinePlaceholder":289},"\n",[49,435,436,439,442,445,448,451,454],{"class":51,"line":219},[49,437,438],{"class":356},"class",[49,440,441],{"class":360}," CommonWebClient",[49,443,444],{"class":55},"(context: ",[49,446,447],{"class":360},"Context",[49,449,450],{"class":55},") : ",[49,452,453],{"class":360},"WebViewClient",[49,455,456],{"class":55},"() {\n",[49,458,459,463,466,469,472,475,478,482],{"class":51,"line":234},[49,460,462],{"class":461},"sbsja","    private",[49,464,465],{"class":356}," var",[49,467,468],{"class":55}," assetLoader: ",[49,470,471],{"class":360},"WebViewAssetLoader",[49,473,474],{"class":356}," =",[49,476,477],{"class":55}," WebViewAssetLoader.",[49,479,481],{"class":480},"sGLFI","Builder",[49,483,484],{"class":55},"()\n",[49,486,487,490,493,496,499,502,505],{"class":51,"line":240},[49,488,489],{"class":55},"            .",[49,491,492],{"class":480},"addPathHandler",[49,494,495],{"class":55},"(",[49,497,498],{"class":72},"\"\u002Fassets\u002F\"",[49,500,501],{"class":55},", WebViewAssetLoader.",[49,503,504],{"class":480},"AssetsPathHandler",[49,506,507],{"class":55},"(context))\n",[49,509,511,513,516],{"class":51,"line":510},15,[49,512,489],{"class":55},[49,514,515],{"class":480},"build",[49,517,484],{"class":55},[49,519,521],{"class":51,"line":520},16,[49,522,433],{"emptyLinePlaceholder":289},[49,524,526,528,531,534,537,540,543,545],{"class":51,"line":525},17,[49,527,462],{"class":461},[49,529,530],{"class":356}," fun",[49,532,533],{"class":480}," md5",[49,535,536],{"class":55},"(input: ",[49,538,539],{"class":360},"String",[49,541,542],{"class":55},"): ",[49,544,539],{"class":360},[49,546,547],{"class":55}," {\n",[49,549,551,555,558,560,564,567,570,572,575,578,581,584,587,590,593,595,598,600,603,605,608,611,614],{"class":51,"line":550},18,[49,552,554],{"class":553},"sVHd0","        return",[49,556,557],{"class":480}," BigInteger",[49,559,495],{"class":55},[49,561,563],{"class":562},"srdBf","1",[49,565,566],{"class":55},", MessageDigest.",[49,568,569],{"class":480},"getInstance",[49,571,495],{"class":55},[49,573,574],{"class":72},"\"MD5\"",[49,576,577],{"class":55},").",[49,579,580],{"class":480},"digest",[49,582,583],{"class":55},"(input.",[49,585,586],{"class":480},"toByteArray",[49,588,589],{"class":55},"())).",[49,591,592],{"class":480},"toString",[49,594,495],{"class":55},[49,596,597],{"class":562},"16",[49,599,577],{"class":55},[49,601,602],{"class":480},"padStart",[49,604,495],{"class":55},[49,606,607],{"class":562},"32",[49,609,610],{"class":55},", ",[49,612,613],{"class":72},"'0'",[49,615,616],{"class":55},")\n",[49,618,620],{"class":51,"line":619},19,[49,621,622],{"class":55},"    }\n",[49,624,626],{"class":51,"line":625},20,[49,627,433],{"emptyLinePlaceholder":289},[49,629,631,634,636,639,642,645,648,650,652,655],{"class":51,"line":630},21,[49,632,633],{"class":461},"    override",[49,635,530],{"class":356},[49,637,638],{"class":480}," shouldOverrideUrlLoading",[49,640,641],{"class":55},"(view: ",[49,643,644],{"class":360},"WebView",[49,646,647],{"class":55},", url: ",[49,649,539],{"class":360},[49,651,542],{"class":55},[49,653,654],{"class":360},"Boolean",[49,656,547],{"class":55},[49,658,660,662],{"class":51,"line":659},22,[49,661,554],{"class":553},[49,663,665],{"class":664},"syTEX"," true\n",[49,667,669],{"class":51,"line":668},23,[49,670,622],{"class":55},[49,672,674],{"class":51,"line":673},24,[49,675,433],{"emptyLinePlaceholder":289},[49,677,679,681,683,686,688,690,693,696,699,702],{"class":51,"line":678},25,[49,680,633],{"class":461},[49,682,530],{"class":356},[49,684,685],{"class":480}," shouldInterceptRequest",[49,687,641],{"class":55},[49,689,644],{"class":360},[49,691,692],{"class":55},"?, request: ",[49,694,695],{"class":360},"WebResourceRequest",[49,697,698],{"class":55},"?): ",[49,700,701],{"class":360},"WebResourceResponse",[49,703,704],{"class":55},"? {\n",[49,706,708,710,713,716,719],{"class":51,"line":707},26,[49,709,554],{"class":553},[49,711,712],{"class":55}," request?.url?.",[49,714,715],{"class":480},"let",[49,717,718],{"class":55}," { url ",[49,720,721],{"class":461},"->\n",[49,723,725,728,731,734,737,739],{"class":51,"line":724},27,[49,726,727],{"class":356},"            val",[49,729,730],{"class":55}," urlString ",[49,732,733],{"class":356},"=",[49,735,736],{"class":55}," url.",[49,738,592],{"class":480},[49,740,484],{"class":55},[49,742,744,747,749,752,755,758,760,763,766,769,772,774,776,779],{"class":51,"line":743},28,[49,745,746],{"class":553},"            if",[49,748,84],{"class":55},[49,750,751],{"class":356},"!",[49,753,754],{"class":55},"urlString.",[49,756,757],{"class":480},"contains",[49,759,495],{"class":55},[49,761,762],{"class":72},"\"appassets.androidplatform.net\"",[49,764,765],{"class":55},") ",[49,767,768],{"class":356},"&&",[49,770,771],{"class":55}," urlString.",[49,773,757],{"class":480},[49,775,495],{"class":55},[49,777,778],{"class":72},"\"aliyuncs.com\"",[49,780,781],{"class":55},")) {\n",[49,783,785,788],{"class":51,"line":784},29,[49,786,787],{"class":553},"                try",[49,789,547],{"class":55},[49,791,793,796,799,801,803,806,809,812,814,817],{"class":51,"line":792},30,[49,794,795],{"class":356},"                    var",[49,797,798],{"class":55}," extension ",[49,800,733],{"class":356},[49,802,771],{"class":55},[49,804,805],{"class":480},"substring",[49,807,808],{"class":55},"(urlString.",[49,810,811],{"class":480},"lastIndexOf",[49,813,495],{"class":55},[49,815,816],{"class":72},"\".\"",[49,818,819],{"class":55},"))\n",[49,821,823,826,829,831,833,836,838,841,844,846],{"class":51,"line":822},31,[49,824,825],{"class":553},"                    if",[49,827,828],{"class":55}," (extension.",[49,830,811],{"class":480},[49,832,495],{"class":55},[49,834,835],{"class":72},"\"?\"",[49,837,765],{"class":55},[49,839,840],{"class":356},">",[49,842,843],{"class":356}," -",[49,845,563],{"class":562},[49,847,848],{"class":55},") {\n",[49,850,852,855,857,860,862,864,867,870,872,874,876],{"class":51,"line":851},32,[49,853,854],{"class":55},"                        extension ",[49,856,733],{"class":356},[49,858,859],{"class":55}," extension.",[49,861,805],{"class":480},[49,863,495],{"class":55},[49,865,866],{"class":562},"0",[49,868,869],{"class":55},", extension.",[49,871,811],{"class":480},[49,873,495],{"class":55},[49,875,835],{"class":72},[49,877,819],{"class":55},[49,879,881],{"class":51,"line":880},33,[49,882,883],{"class":55},"                    }\n",[49,885,887,890,893,895,898,902,904,908,911,914,917],{"class":51,"line":886},34,[49,888,889],{"class":356},"                    val",[49,891,892],{"class":55}," fileName ",[49,894,733],{"class":356},[49,896,897],{"class":72}," \"",[49,899,901],{"class":900},"sjJ54","${",[49,903,333],{"class":480},[49,905,907],{"class":906},"sfo-9","(urlString)",[49,909,910],{"class":900},"}${",[49,912,913],{"class":906},"extension",[49,915,916],{"class":900},"}",[49,918,919],{"class":72},"\"\n",[49,921,923,925,928,930,933],{"class":51,"line":922},35,[49,924,889],{"class":356},[49,926,927],{"class":55}," file ",[49,929,733],{"class":356},[49,931,932],{"class":480}," File",[49,934,935],{"class":55},"(view?.context?.externalCacheDir, fileName)\n",[49,937,939,941,943,945,948,951],{"class":51,"line":938},36,[49,940,825],{"class":553},[49,942,84],{"class":55},[49,944,751],{"class":356},[49,946,947],{"class":55},"file.",[49,949,950],{"class":480},"exists",[49,952,953],{"class":55},"()) {\n",[49,955,957,960,963,965,968,971,974,977,980],{"class":51,"line":956},37,[49,958,959],{"class":356},"                        val",[49,961,962],{"class":55}," conn ",[49,964,733],{"class":356},[49,966,967],{"class":480}," URL",[49,969,970],{"class":55},"(urlString).",[49,972,973],{"class":480},"openConnection",[49,975,976],{"class":55},"() ",[49,978,979],{"class":356},"as",[49,981,982],{"class":55}," HttpURLConnection\n",[49,984,986,989,991],{"class":51,"line":985},38,[49,987,988],{"class":55},"                        conn.connectTimeout ",[49,990,733],{"class":356},[49,992,993],{"class":562}," 5000\n",[49,995,997,1000,1002],{"class":51,"line":996},39,[49,998,999],{"class":55},"                        conn.requestMethod ",[49,1001,733],{"class":356},[49,1003,1004],{"class":72}," \"GET\"\n",[49,1006,1008,1011,1013],{"class":51,"line":1007},40,[49,1009,1010],{"class":55},"                        conn.doInput ",[49,1012,733],{"class":356},[49,1014,665],{"class":664},[49,1016,1018,1021,1024,1027,1030],{"class":51,"line":1017},41,[49,1019,1020],{"class":553},"                        if",[49,1022,1023],{"class":55}," (conn.responseCode ",[49,1025,1026],{"class":356},"==",[49,1028,1029],{"class":562}," 200",[49,1031,848],{"class":55},[49,1033,1035,1038,1041,1043,1046],{"class":51,"line":1034},42,[49,1036,1037],{"class":356},"                            val",[49,1039,1040],{"class":55}," fos ",[49,1042,733],{"class":356},[49,1044,1045],{"class":480}," FileOutputStream",[49,1047,1048],{"class":55},"(file)\n",[49,1050,1052,1054,1057,1059,1062,1064,1067],{"class":51,"line":1051},43,[49,1053,1037],{"class":356},[49,1055,1056],{"class":55}," buffer ",[49,1058,733],{"class":356},[49,1060,1061],{"class":480}," ByteArray",[49,1063,495],{"class":55},[49,1065,1066],{"class":562},"1024",[49,1068,616],{"class":55},[49,1070,1072,1075,1078,1080],{"class":51,"line":1071},44,[49,1073,1074],{"class":356},"                            var",[49,1076,1077],{"class":55}," len ",[49,1079,733],{"class":356},[49,1081,1082],{"class":562}," 0\n",[49,1084,1086,1089,1092,1095,1098,1101,1104,1106,1109,1112,1114,1116],{"class":51,"line":1085},45,[49,1087,1088],{"class":553},"                            while",[49,1090,1091],{"class":55}," (conn.inputStream.",[49,1093,1094],{"class":480},"read",[49,1096,1097],{"class":55},"(buffer).",[49,1099,1100],{"class":480},"also",[49,1102,1103],{"class":55}," { len ",[49,1105,733],{"class":356},[49,1107,1108],{"class":55}," it } ",[49,1110,1111],{"class":356},"!=",[49,1113,843],{"class":356},[49,1115,563],{"class":562},[49,1117,848],{"class":55},[49,1119,1121,1124,1127,1130,1132],{"class":51,"line":1120},46,[49,1122,1123],{"class":55},"                                fos.",[49,1125,1126],{"class":480},"write",[49,1128,1129],{"class":55},"(buffer, ",[49,1131,866],{"class":562},[49,1133,1134],{"class":55},", len)\n",[49,1136,1138],{"class":51,"line":1137},47,[49,1139,1140],{"class":55},"                            }\n",[49,1142,1144,1147,1150],{"class":51,"line":1143},48,[49,1145,1146],{"class":55},"                            conn.inputStream.",[49,1148,1149],{"class":480},"close",[49,1151,484],{"class":55},[49,1153,1155,1158,1160],{"class":51,"line":1154},49,[49,1156,1157],{"class":55},"                            fos.",[49,1159,1149],{"class":480},[49,1161,484],{"class":55},[49,1163,1165],{"class":51,"line":1164},50,[49,1166,1167],{"class":55},"                        }\n",[49,1169,1171],{"class":51,"line":1170},51,[49,1172,883],{"class":55},[49,1174,1176,1179,1182,1185,1188,1191,1194,1197,1200,1203],{"class":51,"line":1175},52,[49,1177,1178],{"class":480},"                    WebResourceResponse",[49,1180,1181],{"class":55},"(MimeTypeMap.",[49,1183,1184],{"class":480},"getSingleton",[49,1186,1187],{"class":55},"().",[49,1189,1190],{"class":480},"getMimeTypeFromExtension",[49,1192,1193],{"class":55},"(extension), ",[49,1195,1196],{"class":72},"\"UTF-8\"",[49,1198,1199],{"class":55},", file.",[49,1201,1202],{"class":480},"inputStream",[49,1204,1205],{"class":55},"())\n",[49,1207,1209,1212,1215,1218,1221],{"class":51,"line":1208},53,[49,1210,1211],{"class":55},"                } ",[49,1213,1214],{"class":356},"catch",[49,1216,1217],{"class":55}," (ex: ",[49,1219,1220],{"class":360},"Exception",[49,1222,848],{"class":55},[49,1224,1226,1229,1231],{"class":51,"line":1225},54,[49,1227,1228],{"class":55},"                    assetLoader.",[49,1230,326],{"class":480},[49,1232,1233],{"class":55},"(url)\n",[49,1235,1237],{"class":51,"line":1236},55,[49,1238,1239],{"class":55},"                }\n",[49,1241,1243,1246,1249],{"class":51,"line":1242},56,[49,1244,1245],{"class":55},"            } ",[49,1247,1248],{"class":553},"else",[49,1250,547],{"class":55},[49,1252,1254,1257,1260,1262,1265,1267],{"class":51,"line":1253},57,[49,1255,1256],{"class":356},"                val",[49,1258,1259],{"class":55}," response ",[49,1261,733],{"class":356},[49,1263,1264],{"class":55}," assetLoader.",[49,1266,326],{"class":480},[49,1268,1233],{"class":55},[49,1270,1272,1275,1278,1281,1283,1286,1288,1290,1293,1296,1298,1300,1303],{"class":51,"line":1271},58,[49,1273,1274],{"class":553},"                if",[49,1276,1277],{"class":55}," (url.path?.",[49,1279,1280],{"class":480},"endsWith",[49,1282,495],{"class":55},[49,1284,1285],{"class":72},"\".js\"",[49,1287,765],{"class":55},[49,1289,1026],{"class":356},[49,1291,1292],{"class":664}," true",[49,1294,1295],{"class":356}," &&",[49,1297,1259],{"class":55},[49,1299,1111],{"class":356},[49,1301,1302],{"class":59}," null",[49,1304,848],{"class":55},[49,1306,1308,1311,1313],{"class":51,"line":1307},59,[49,1309,1310],{"class":55},"                    response.mimeType ",[49,1312,733],{"class":356},[49,1314,1315],{"class":72}," \"text\u002Fjavascript\"\n",[49,1317,1319],{"class":51,"line":1318},60,[49,1320,1239],{"class":55},[49,1322,1324],{"class":51,"line":1323},61,[49,1325,1326],{"class":55},"                response\n",[49,1328,1330],{"class":51,"line":1329},62,[49,1331,1332],{"class":55},"            }\n",[49,1334,1336],{"class":51,"line":1335},63,[49,1337,1338],{"class":55},"        }\n",[49,1340,1342],{"class":51,"line":1341},64,[49,1343,622],{"class":55},[49,1345,1347],{"class":51,"line":1346},65,[49,1348,433],{"emptyLinePlaceholder":289},[49,1350,1352,1354,1356,1359,1361,1363,1366,1369,1372,1375],{"class":51,"line":1351},66,[49,1353,633],{"class":461},[49,1355,530],{"class":356},[49,1357,1358],{"class":480}," onReceivedSslError",[49,1360,641],{"class":55},[49,1362,644],{"class":360},[49,1364,1365],{"class":55},"?, handler: ",[49,1367,1368],{"class":360},"SslErrorHandler",[49,1370,1371],{"class":55},"?, error: ",[49,1373,1374],{"class":360},"SslError",[49,1376,1377],{"class":55},"?) {\n",[49,1379,1381,1384,1387],{"class":51,"line":1380},67,[49,1382,1383],{"class":55},"        handler?.",[49,1385,1386],{"class":480},"proceed",[49,1388,484],{"class":55},[49,1390,1392,1395,1398,1401],{"class":51,"line":1391},68,[49,1393,1394],{"class":59},"        super",[49,1396,1397],{"class":55},".",[49,1399,1400],{"class":480},"onReceivedSslError",[49,1402,1403],{"class":55},"(view, handler, error)\n",[49,1405,1407],{"class":51,"line":1406},69,[49,1408,622],{"class":55},[49,1410,1412],{"class":51,"line":1411},70,[49,1413,1414],{"class":55},"}\n",[278,1416,1417],{},"html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sfo-9, html code.shiki .sfo-9{--shiki-light:#90A4AE;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":45,"searchDepth":66,"depth":66,"links":1419},[],"2020-12-18",{},"\u002Fposts\u002F2020\u002Fandroid-webview-picture-cache",{"text":1424,"minutes":1425,"time":1426,"words":1427},"3 min read",2.52,151200,504,{"title":305,"description":310},{"loc":1422},"posts\u002F2020\u002F20201218.android-webview-picture-cache",[300,301],"uWP_CIUYC6vbsshGYZ4ykWXKhER8hR9mpP1uhdAGLKI",{"id":1434,"title":1435,"body":1436,"class":283,"cover":283,"coverSize":283,"date":2017,"description":1440,"draft":286,"extension":287,"hideComments":286,"location":2018,"meta":2019,"navigation":289,"path":2020,"readingTime":2021,"seo":2026,"sitemap":2027,"stem":2028,"tags":2029,"time":2030,"weather":283,"__hash__":2031},"posts\u002Fposts\u002F2012\u002F20120731.android-unit-test.md","Android 单元测试",{"type":25,"value":1437,"toc":2015},[1438,1441,1444,1447,1450,1457,1460,1467,1473,1514,1519,1587,1590,1672,1675,1681,1710,1713,1987,1990,1993,1996,2000,2003,2006,2009,2012],[28,1439,1440],{},"今天终于向让我退缩了很久的单元测试前进了一步。",[28,1442,1443],{},"很早就知道 Android 里可以建立测试项目，但我一直不明白怎么去用，也总觉得我的这些个小项目，需要用到测试这么高端的东西吗？今天突然对之前搁置很久的全能计算器的重构有了一些灵感，写了个计算专用的工具类，然而，之前项目中有不少错误，现在是没法运行的，于是，我只想对这个工具类进行测试，怎么做呢？",[28,1445,1446],{},"如果不用单元测试的话，得先把整个项目的错误改掉，编译成功，然后通过日志输出的方式来测试那个类，但相当繁琐。如果使用单元测试的话，就相当轻松啦。",[28,1448,1449],{},"Android 里的单元测试有两种方式，一种是建立一个新的测试项目（Android Test Project），那个似乎是对整个项目进行测试的，没有仔细去了解，还是比较庞大，跟我们这里的要求不符。",[28,1451,1452,1453,1456],{},"另一种方式，则是在需要测试的项目里新建一个测试类，继承 ",[35,1454,1455],{},"AndroidTestCase","，然后运行时使用 Android JUnit Test 的方式运行就可以了。",[28,1458,1459],{},"下面开始看代码：",[28,1461,1462,1463,1466],{},"首先，需要对项目的 ",[35,1464,1465],{},"AndroidManifest.xml"," 文件进行一些改动",[28,1468,33,1469,1472],{},[35,1470,1471],{},"\u003Capplication>"," 结点里加入：",[40,1474,1478],{"className":1475,"code":1476,"language":1477,"meta":45,"style":45},"language-xml shiki shiki-themes material-theme-lighter github-light github-dark","\u003Cuses-library android:name=\"android.test.runner\" \u002F>\n","xml",[35,1479,1480],{"__ignoreMap":45},[49,1481,1482,1486,1490,1494,1498,1501,1503,1506,1509,1511],{"class":51,"line":52},[49,1483,1485],{"class":1484},"sP7_E","\u003C",[49,1487,1489],{"class":1488},"sQzsp","uses-library",[49,1491,1493],{"class":1492},"s9AJx"," android",[49,1495,1497],{"class":1496},"stp6e",":",[49,1499,1500],{"class":1492},"name",[49,1502,733],{"class":1484},[49,1504,1505],{"class":900},"\"",[49,1507,1508],{"class":72},"android.test.runner",[49,1510,1505],{"class":900},[49,1512,1513],{"class":1484}," \u002F>\n",[28,1515,33,1516,1518],{},[35,1517,1471],{}," 结点外加入：",[40,1520,1522],{"className":1475,"code":1521,"language":1477,"meta":45,"style":45},"\u003Cinstrumentation\n    android:name=\"android.test.InstrumentationTestRunner\"\n    android:label=\"Test\"\n    android:targetPackage=\"你的包名\" \u002F>\n",[35,1523,1524,1531,1549,1567],{"__ignoreMap":45},[49,1525,1526,1528],{"class":51,"line":52},[49,1527,1485],{"class":1484},[49,1529,1530],{"class":1488},"instrumentation\n",[49,1532,1533,1536,1538,1540,1542,1544,1547],{"class":51,"line":66},[49,1534,1535],{"class":1492},"    android",[49,1537,1497],{"class":1496},[49,1539,1500],{"class":1492},[49,1541,733],{"class":1484},[49,1543,1505],{"class":900},[49,1545,1546],{"class":72},"android.test.InstrumentationTestRunner",[49,1548,919],{"class":900},[49,1550,1551,1553,1555,1558,1560,1562,1565],{"class":51,"line":93},[49,1552,1535],{"class":1492},[49,1554,1497],{"class":1496},[49,1556,1557],{"class":1492},"label",[49,1559,733],{"class":1484},[49,1561,1505],{"class":900},[49,1563,1564],{"class":72},"Test",[49,1566,919],{"class":900},[49,1568,1569,1571,1573,1576,1578,1580,1583,1585],{"class":51,"line":105},[49,1570,1535],{"class":1492},[49,1572,1497],{"class":1496},[49,1574,1575],{"class":1492},"targetPackage",[49,1577,733],{"class":1484},[49,1579,1505],{"class":900},[49,1581,1582],{"class":72},"你的包名",[49,1584,1505],{"class":900},[49,1586,1513],{"class":1484},[28,1588,1589],{},"注意，此处的包名一定要与最上方的",[40,1591,1593],{"className":1475,"code":1592,"language":1477,"meta":45,"style":45},"\u003Cmanifest xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"\n    package=\"包名\"\n    android:versionCode=\"版本号\"\n    android:versionName=\"版本名\" >\n",[35,1594,1595,1619,1633,1651],{"__ignoreMap":45},[49,1596,1597,1599,1602,1605,1607,1610,1612,1614,1617],{"class":51,"line":52},[49,1598,1485],{"class":1484},[49,1600,1601],{"class":1488},"manifest",[49,1603,1604],{"class":1492}," xmlns",[49,1606,1497],{"class":1496},[49,1608,1609],{"class":1492},"android",[49,1611,733],{"class":1484},[49,1613,1505],{"class":900},[49,1615,1616],{"class":72},"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid",[49,1618,919],{"class":900},[49,1620,1621,1624,1626,1628,1631],{"class":51,"line":66},[49,1622,1623],{"class":1492},"    package",[49,1625,733],{"class":1484},[49,1627,1505],{"class":900},[49,1629,1630],{"class":72},"包名",[49,1632,919],{"class":900},[49,1634,1635,1637,1639,1642,1644,1646,1649],{"class":51,"line":93},[49,1636,1535],{"class":1492},[49,1638,1497],{"class":1496},[49,1640,1641],{"class":1492},"versionCode",[49,1643,733],{"class":1484},[49,1645,1505],{"class":900},[49,1647,1648],{"class":72},"版本号",[49,1650,919],{"class":900},[49,1652,1653,1655,1657,1660,1662,1664,1667,1669],{"class":51,"line":105},[49,1654,1535],{"class":1492},[49,1656,1497],{"class":1496},[49,1658,1659],{"class":1492},"versionName",[49,1661,733],{"class":1484},[49,1663,1505],{"class":900},[49,1665,1666],{"class":72},"版本名",[49,1668,1505],{"class":900},[49,1670,1671],{"class":1484}," >\n",[28,1673,1674],{},"这里的包名一致。",[28,1676,1677,1678,1680],{},"同时，还需要添加权限，也在 ",[35,1679,1471],{}," 外：",[40,1682,1684],{"className":1475,"code":1683,"language":1477,"meta":45,"style":45},"\u003Cuses-permission android:name=\"android.permission.RUN_INSTRUMENTATION\" \u002F>\n",[35,1685,1686],{"__ignoreMap":45},[49,1687,1688,1690,1693,1695,1697,1699,1701,1703,1706,1708],{"class":51,"line":52},[49,1689,1485],{"class":1484},[49,1691,1692],{"class":1488},"uses-permission",[49,1694,1493],{"class":1492},[49,1696,1497],{"class":1496},[49,1698,1500],{"class":1492},[49,1700,733],{"class":1484},[49,1702,1505],{"class":900},[49,1704,1705],{"class":72},"android.permission.RUN_INSTRUMENTATION",[49,1707,1505],{"class":900},[49,1709,1513],{"class":1484},[28,1711,1712],{},"下面，新建一个类，我是新建的一个 CalcTest 类，用来测试 Calc 类的运行情况：",[40,1714,1718],{"className":1715,"code":1716,"language":1717,"meta":45,"style":45},"language-java shiki shiki-themes material-theme-lighter github-light github-dark","public class CalcTest extends AndroidTestCase\n{\n    private static final String TAG = \"CalcTest\";\n\n    public void testPlus()\n    {\n        String answer = Calc.add(\"1.31\", \"4.63\");\n        Log.i(TAG, answer);\n        Assert.assertEquals(\"5.94\", answer);\n    }\n\n    public void testMinus()\n    {\n        String answer = Calc.subtract(\"1.7\", \"1.6\");\n        Log.i(TAG, answer);\n        Assert.assertEquals(\"0.1\", answer);\n    }\n}\n","java",[35,1719,1720,1737,1742,1771,1775,1788,1793,1833,1855,1880,1884,1888,1899,1903,1938,1956,1979,1983],{"__ignoreMap":45},[49,1721,1722,1725,1728,1731,1734],{"class":51,"line":52},[49,1723,1724],{"class":461},"public",[49,1726,1727],{"class":461}," class",[49,1729,1730],{"class":360}," CalcTest",[49,1732,1733],{"class":461}," extends",[49,1735,1736],{"class":360}," AndroidTestCase\n",[49,1738,1739],{"class":51,"line":66},[49,1740,1741],{"class":1484},"{\n",[49,1743,1744,1746,1749,1752,1756,1759,1761,1763,1766,1768],{"class":51,"line":93},[49,1745,462],{"class":461},[49,1747,1748],{"class":461}," static",[49,1750,1751],{"class":461}," final",[49,1753,1755],{"class":1754},"s_bVq"," String",[49,1757,1758],{"class":55}," TAG ",[49,1760,733],{"class":356},[49,1762,897],{"class":900},[49,1764,1765],{"class":72},"CalcTest",[49,1767,1505],{"class":900},[49,1769,1770],{"class":1484},";\n",[49,1772,1773],{"class":51,"line":105},[49,1774,433],{"emptyLinePlaceholder":289},[49,1776,1777,1780,1783,1786],{"class":51,"line":122},[49,1778,1779],{"class":461},"    public",[49,1781,1782],{"class":461}," void",[49,1784,1785],{"class":480}," testPlus",[49,1787,484],{"class":1484},[49,1789,1790],{"class":51,"line":134},[49,1791,1792],{"class":1484},"    {\n",[49,1794,1795,1798,1801,1803,1806,1808,1811,1813,1815,1818,1820,1823,1825,1828,1830],{"class":51,"line":154},[49,1796,1797],{"class":1754},"        String",[49,1799,1800],{"class":55}," answer ",[49,1802,733],{"class":356},[49,1804,1805],{"class":55}," Calc",[49,1807,1397],{"class":1484},[49,1809,1810],{"class":480},"add",[49,1812,495],{"class":1484},[49,1814,1505],{"class":900},[49,1816,1817],{"class":72},"1.31",[49,1819,1505],{"class":900},[49,1821,1822],{"class":1484},",",[49,1824,897],{"class":900},[49,1826,1827],{"class":72},"4.63",[49,1829,1505],{"class":900},[49,1831,1832],{"class":1484},");\n",[49,1834,1835,1838,1840,1843,1845,1848,1850,1853],{"class":51,"line":164},[49,1836,1837],{"class":55},"        Log",[49,1839,1397],{"class":1484},[49,1841,1842],{"class":480},"i",[49,1844,495],{"class":1484},[49,1846,1847],{"class":55},"TAG",[49,1849,1822],{"class":1484},[49,1851,1852],{"class":55}," answer",[49,1854,1832],{"class":1484},[49,1856,1857,1860,1862,1865,1867,1869,1872,1874,1876,1878],{"class":51,"line":179},[49,1858,1859],{"class":55},"        Assert",[49,1861,1397],{"class":1484},[49,1863,1864],{"class":480},"assertEquals",[49,1866,495],{"class":1484},[49,1868,1505],{"class":900},[49,1870,1871],{"class":72},"5.94",[49,1873,1505],{"class":900},[49,1875,1822],{"class":1484},[49,1877,1852],{"class":55},[49,1879,1832],{"class":1484},[49,1881,1882],{"class":51,"line":189},[49,1883,622],{"class":1484},[49,1885,1886],{"class":51,"line":209},[49,1887,433],{"emptyLinePlaceholder":289},[49,1889,1890,1892,1894,1897],{"class":51,"line":219},[49,1891,1779],{"class":461},[49,1893,1782],{"class":461},[49,1895,1896],{"class":480}," testMinus",[49,1898,484],{"class":1484},[49,1900,1901],{"class":51,"line":234},[49,1902,1792],{"class":1484},[49,1904,1905,1907,1909,1911,1913,1915,1918,1920,1922,1925,1927,1929,1931,1934,1936],{"class":51,"line":240},[49,1906,1797],{"class":1754},[49,1908,1800],{"class":55},[49,1910,733],{"class":356},[49,1912,1805],{"class":55},[49,1914,1397],{"class":1484},[49,1916,1917],{"class":480},"subtract",[49,1919,495],{"class":1484},[49,1921,1505],{"class":900},[49,1923,1924],{"class":72},"1.7",[49,1926,1505],{"class":900},[49,1928,1822],{"class":1484},[49,1930,897],{"class":900},[49,1932,1933],{"class":72},"1.6",[49,1935,1505],{"class":900},[49,1937,1832],{"class":1484},[49,1939,1940,1942,1944,1946,1948,1950,1952,1954],{"class":51,"line":510},[49,1941,1837],{"class":55},[49,1943,1397],{"class":1484},[49,1945,1842],{"class":480},[49,1947,495],{"class":1484},[49,1949,1847],{"class":55},[49,1951,1822],{"class":1484},[49,1953,1852],{"class":55},[49,1955,1832],{"class":1484},[49,1957,1958,1960,1962,1964,1966,1968,1971,1973,1975,1977],{"class":51,"line":520},[49,1959,1859],{"class":55},[49,1961,1397],{"class":1484},[49,1963,1864],{"class":480},[49,1965,495],{"class":1484},[49,1967,1505],{"class":900},[49,1969,1970],{"class":72},"0.1",[49,1972,1505],{"class":900},[49,1974,1822],{"class":1484},[49,1976,1852],{"class":55},[49,1978,1832],{"class":1484},[49,1980,1981],{"class":51,"line":525},[49,1982,622],{"class":1484},[49,1984,1985],{"class":51,"line":550},[49,1986,1414],{"class":1484},[28,1988,1989],{},"Assert 是 junit 里的一个类，比如我使用的是 assertEquals 方法，如果两个参数的值相等，则运行时不会报错，如果值不等，则会报错。",[28,1991,1992],{},"编写好测试类之后，右击，运行方式里选择 Android JUnit Test，然后等待即可。",[28,1994,1995],{},"测试成功的截图：",[1997,1998],"post-image",{"filename":1999},"01.png",[28,2001,2002],{},"如果我们把 testMinus()中的 Assert.assertEquals(“0.1″, answer)改成 Assert.assertEquals(“0.2″, answer)，再运行的话，就会出现：",[1997,2004],{"filename":2005},"02.png",[28,2007,2008],{},"可以在故障跟踪里看到到底哪里出了问题。",[28,2010,2011],{},"好了，简单的 Android 单元测试就介绍到这里，以后可以很轻松地对某个类进行测试了，而不需要运行整个项目。",[278,2013,2014],{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_bVq, html code.shiki .s_bVq{--shiki-light:#9C3EDA;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":45,"searchDepth":66,"depth":66,"links":2016},[],"2012-07-31","成都",{},"\u002Fposts\u002F2012\u002Fandroid-unit-test",{"text":2022,"minutes":2023,"time":2024,"words":2025},"4 min read",3.25,195000,650,{"title":1435,"description":1440},{"loc":2020},"posts\u002F2012\u002F20120731.android-unit-test",[300,301],"中午","-EQ96eMLk-j-puq0a9ftLoOxuMvfOt9YYAQkFoYxj1g",{"id":2033,"title":2034,"body":2035,"class":283,"cover":283,"coverSize":283,"date":2706,"description":2707,"draft":286,"extension":287,"hideComments":286,"location":2018,"meta":2708,"navigation":289,"path":2709,"readingTime":2710,"seo":2714,"sitemap":2715,"stem":2716,"tags":2717,"time":2718,"weather":283,"__hash__":2719},"posts\u002Fposts\u002F2012\u002F20120723.android-wifi-connection.md","Android Wifi 的设置、连接操作",{"type":25,"value":2036,"toc":2704},[2037,2044,2047,2050,2278,2281,2571,2574,2577,2678,2695,2698,2701],[28,2038,2039,2040],{},"我项目中这部分的代码是参考的这里的：",[269,2041,2042],{"href":2042,"rel":2043},"http:\u002F\u002Fblog.csdn.net\u002Fcscmaker\u002Farticle\u002Fdetails\u002F7032277",[273],[28,2045,2046],{},"但是，参考了这段代码之后可没少忙活！怎么试都连不上，wifi 的信息是创建了，可就是没法连接上。百思不得其解，后来我想，会不会是设置的地方出了问题。",[28,2048,2049],{},"原来是这样设置的：",[40,2051,2053],{"className":1715,"code":2052,"language":1717,"meta":45,"style":45},"config.preSharedKey = \"\\\"\" + Password + \"\\\"\";\nconfig.hiddenSSID = true;\nconfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);\nconfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);\nconfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);\nconfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);\nconfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);\nconfig.status = WifiConfiguration.Status.ENABLED;\n",[35,2054,2055,2091,2106,2137,2166,2195,2223,2252],{"__ignoreMap":45},[49,2056,2057,2060,2062,2065,2067,2069,2072,2074,2077,2080,2083,2085,2087,2089],{"class":51,"line":52},[49,2058,2059],{"class":55},"config",[49,2061,1397],{"class":1484},[49,2063,2064],{"class":55},"preSharedKey ",[49,2066,733],{"class":356},[49,2068,897],{"class":900},[49,2070,2071],{"class":378},"\\\"",[49,2073,1505],{"class":900},[49,2075,2076],{"class":356}," +",[49,2078,2079],{"class":55}," Password ",[49,2081,2082],{"class":356},"+",[49,2084,897],{"class":900},[49,2086,2071],{"class":378},[49,2088,1505],{"class":900},[49,2090,1770],{"class":1484},[49,2092,2093,2095,2097,2100,2102,2104],{"class":51,"line":66},[49,2094,2059],{"class":55},[49,2096,1397],{"class":1484},[49,2098,2099],{"class":55},"hiddenSSID ",[49,2101,733],{"class":356},[49,2103,1292],{"class":59},[49,2105,1770],{"class":1484},[49,2107,2108,2110,2112,2115,2117,2120,2122,2125,2127,2130,2132,2135],{"class":51,"line":93},[49,2109,2059],{"class":55},[49,2111,1397],{"class":1484},[49,2113,2114],{"class":55},"allowedAuthAlgorithms",[49,2116,1397],{"class":1484},[49,2118,2119],{"class":480},"set",[49,2121,495],{"class":1484},[49,2123,2124],{"class":55},"WifiConfiguration",[49,2126,1397],{"class":1484},[49,2128,2129],{"class":55},"AuthAlgorithm",[49,2131,1397],{"class":1484},[49,2133,2134],{"class":55},"OPEN",[49,2136,1832],{"class":1484},[49,2138,2139,2141,2143,2146,2148,2150,2152,2154,2156,2159,2161,2164],{"class":51,"line":105},[49,2140,2059],{"class":55},[49,2142,1397],{"class":1484},[49,2144,2145],{"class":55},"allowedGroupCiphers",[49,2147,1397],{"class":1484},[49,2149,2119],{"class":480},[49,2151,495],{"class":1484},[49,2153,2124],{"class":55},[49,2155,1397],{"class":1484},[49,2157,2158],{"class":55},"GroupCipher",[49,2160,1397],{"class":1484},[49,2162,2163],{"class":55},"TKIP",[49,2165,1832],{"class":1484},[49,2167,2168,2170,2172,2175,2177,2179,2181,2183,2185,2188,2190,2193],{"class":51,"line":122},[49,2169,2059],{"class":55},[49,2171,1397],{"class":1484},[49,2173,2174],{"class":55},"allowedKeyManagement",[49,2176,1397],{"class":1484},[49,2178,2119],{"class":480},[49,2180,495],{"class":1484},[49,2182,2124],{"class":55},[49,2184,1397],{"class":1484},[49,2186,2187],{"class":55},"KeyMgmt",[49,2189,1397],{"class":1484},[49,2191,2192],{"class":55},"WPA_PSK",[49,2194,1832],{"class":1484},[49,2196,2197,2199,2201,2204,2206,2208,2210,2212,2214,2217,2219,2221],{"class":51,"line":134},[49,2198,2059],{"class":55},[49,2200,1397],{"class":1484},[49,2202,2203],{"class":55},"allowedPairwiseCiphers",[49,2205,1397],{"class":1484},[49,2207,2119],{"class":480},[49,2209,495],{"class":1484},[49,2211,2124],{"class":55},[49,2213,1397],{"class":1484},[49,2215,2216],{"class":55},"PairwiseCipher",[49,2218,1397],{"class":1484},[49,2220,2163],{"class":55},[49,2222,1832],{"class":1484},[49,2224,2225,2227,2229,2232,2234,2236,2238,2240,2242,2245,2247,2250],{"class":51,"line":154},[49,2226,2059],{"class":55},[49,2228,1397],{"class":1484},[49,2230,2231],{"class":55},"allowedProtocols",[49,2233,1397],{"class":1484},[49,2235,2119],{"class":480},[49,2237,495],{"class":1484},[49,2239,2124],{"class":55},[49,2241,1397],{"class":1484},[49,2243,2244],{"class":55},"Protocol",[49,2246,1397],{"class":1484},[49,2248,2249],{"class":55},"WPA",[49,2251,1832],{"class":1484},[49,2253,2254,2256,2258,2261,2263,2266,2268,2271,2273,2276],{"class":51,"line":164},[49,2255,2059],{"class":55},[49,2257,1397],{"class":1484},[49,2259,2260],{"class":55},"status ",[49,2262,733],{"class":356},[49,2264,2265],{"class":55}," WifiConfiguration",[49,2267,1397],{"class":1484},[49,2269,2270],{"class":55},"Status",[49,2272,1397],{"class":1484},[49,2274,2275],{"class":55},"ENABLED",[49,2277,1770],{"class":1484},[28,2279,2280],{},"我是这样检测的，我自己手动连接好一个网络，然后获取这个连接，将下面的信息输出：",[40,2282,2284],{"className":1715,"code":2283,"language":1717,"meta":45,"style":45},"Log.i(TAG, \"SSID:\" + existingConfig.SSID);\nLog.i(TAG, \"preSharedKey:\" + existingConfig.preSharedKey);\nLog.i(TAG, \"hiddenSSID:\" + existingConfig.hiddenSSID);\nLog.i(TAG, \"allowedAuthAlgorithms:\" + existingConfig.allowedAuthAlgorithms);\nLog.i(TAG, \"allowedGroupCiphers:\" + existingConfig.allowedGroupCiphers);\nLog.i(TAG, \"allowedKeyManagement:\" + existingConfig.allowedKeyManagement);\nLog.i(TAG, \"allowedPairwiseCiphers:\" + existingConfig.allowedPairwiseCiphers);\nLog.i(TAG, \"allowedProtocols:\" + existingConfig.allowedProtocols);\nLog.i(TAG, \"status:\" + existingConfig.status);\n",[35,2285,2286,2320,2352,2384,2415,2446,2477,2508,2539],{"__ignoreMap":45},[49,2287,2288,2291,2293,2295,2297,2299,2301,2303,2306,2308,2310,2313,2315,2318],{"class":51,"line":52},[49,2289,2290],{"class":55},"Log",[49,2292,1397],{"class":1484},[49,2294,1842],{"class":480},[49,2296,495],{"class":1484},[49,2298,1847],{"class":55},[49,2300,1822],{"class":1484},[49,2302,897],{"class":900},[49,2304,2305],{"class":72},"SSID:",[49,2307,1505],{"class":900},[49,2309,2076],{"class":356},[49,2311,2312],{"class":55}," existingConfig",[49,2314,1397],{"class":1484},[49,2316,2317],{"class":55},"SSID",[49,2319,1832],{"class":1484},[49,2321,2322,2324,2326,2328,2330,2332,2334,2336,2339,2341,2343,2345,2347,2350],{"class":51,"line":66},[49,2323,2290],{"class":55},[49,2325,1397],{"class":1484},[49,2327,1842],{"class":480},[49,2329,495],{"class":1484},[49,2331,1847],{"class":55},[49,2333,1822],{"class":1484},[49,2335,897],{"class":900},[49,2337,2338],{"class":72},"preSharedKey:",[49,2340,1505],{"class":900},[49,2342,2076],{"class":356},[49,2344,2312],{"class":55},[49,2346,1397],{"class":1484},[49,2348,2349],{"class":55},"preSharedKey",[49,2351,1832],{"class":1484},[49,2353,2354,2356,2358,2360,2362,2364,2366,2368,2371,2373,2375,2377,2379,2382],{"class":51,"line":93},[49,2355,2290],{"class":55},[49,2357,1397],{"class":1484},[49,2359,1842],{"class":480},[49,2361,495],{"class":1484},[49,2363,1847],{"class":55},[49,2365,1822],{"class":1484},[49,2367,897],{"class":900},[49,2369,2370],{"class":72},"hiddenSSID:",[49,2372,1505],{"class":900},[49,2374,2076],{"class":356},[49,2376,2312],{"class":55},[49,2378,1397],{"class":1484},[49,2380,2381],{"class":55},"hiddenSSID",[49,2383,1832],{"class":1484},[49,2385,2386,2388,2390,2392,2394,2396,2398,2400,2403,2405,2407,2409,2411,2413],{"class":51,"line":105},[49,2387,2290],{"class":55},[49,2389,1397],{"class":1484},[49,2391,1842],{"class":480},[49,2393,495],{"class":1484},[49,2395,1847],{"class":55},[49,2397,1822],{"class":1484},[49,2399,897],{"class":900},[49,2401,2402],{"class":72},"allowedAuthAlgorithms:",[49,2404,1505],{"class":900},[49,2406,2076],{"class":356},[49,2408,2312],{"class":55},[49,2410,1397],{"class":1484},[49,2412,2114],{"class":55},[49,2414,1832],{"class":1484},[49,2416,2417,2419,2421,2423,2425,2427,2429,2431,2434,2436,2438,2440,2442,2444],{"class":51,"line":122},[49,2418,2290],{"class":55},[49,2420,1397],{"class":1484},[49,2422,1842],{"class":480},[49,2424,495],{"class":1484},[49,2426,1847],{"class":55},[49,2428,1822],{"class":1484},[49,2430,897],{"class":900},[49,2432,2433],{"class":72},"allowedGroupCiphers:",[49,2435,1505],{"class":900},[49,2437,2076],{"class":356},[49,2439,2312],{"class":55},[49,2441,1397],{"class":1484},[49,2443,2145],{"class":55},[49,2445,1832],{"class":1484},[49,2447,2448,2450,2452,2454,2456,2458,2460,2462,2465,2467,2469,2471,2473,2475],{"class":51,"line":134},[49,2449,2290],{"class":55},[49,2451,1397],{"class":1484},[49,2453,1842],{"class":480},[49,2455,495],{"class":1484},[49,2457,1847],{"class":55},[49,2459,1822],{"class":1484},[49,2461,897],{"class":900},[49,2463,2464],{"class":72},"allowedKeyManagement:",[49,2466,1505],{"class":900},[49,2468,2076],{"class":356},[49,2470,2312],{"class":55},[49,2472,1397],{"class":1484},[49,2474,2174],{"class":55},[49,2476,1832],{"class":1484},[49,2478,2479,2481,2483,2485,2487,2489,2491,2493,2496,2498,2500,2502,2504,2506],{"class":51,"line":154},[49,2480,2290],{"class":55},[49,2482,1397],{"class":1484},[49,2484,1842],{"class":480},[49,2486,495],{"class":1484},[49,2488,1847],{"class":55},[49,2490,1822],{"class":1484},[49,2492,897],{"class":900},[49,2494,2495],{"class":72},"allowedPairwiseCiphers:",[49,2497,1505],{"class":900},[49,2499,2076],{"class":356},[49,2501,2312],{"class":55},[49,2503,1397],{"class":1484},[49,2505,2203],{"class":55},[49,2507,1832],{"class":1484},[49,2509,2510,2512,2514,2516,2518,2520,2522,2524,2527,2529,2531,2533,2535,2537],{"class":51,"line":164},[49,2511,2290],{"class":55},[49,2513,1397],{"class":1484},[49,2515,1842],{"class":480},[49,2517,495],{"class":1484},[49,2519,1847],{"class":55},[49,2521,1822],{"class":1484},[49,2523,897],{"class":900},[49,2525,2526],{"class":72},"allowedProtocols:",[49,2528,1505],{"class":900},[49,2530,2076],{"class":356},[49,2532,2312],{"class":55},[49,2534,1397],{"class":1484},[49,2536,2231],{"class":55},[49,2538,1832],{"class":1484},[49,2540,2541,2543,2545,2547,2549,2551,2553,2555,2558,2560,2562,2564,2566,2569],{"class":51,"line":179},[49,2542,2290],{"class":55},[49,2544,1397],{"class":1484},[49,2546,1842],{"class":480},[49,2548,495],{"class":1484},[49,2550,1847],{"class":55},[49,2552,1822],{"class":1484},[49,2554,897],{"class":900},[49,2556,2557],{"class":72},"status:",[49,2559,1505],{"class":900},[49,2561,2076],{"class":356},[49,2563,2312],{"class":55},[49,2565,1397],{"class":1484},[49,2567,2568],{"class":55},"status",[49,2570,1832],{"class":1484},[28,2572,2573],{},"这样，就可以对比，就知道怎样的是对的，哪里不对。",[28,2575,2576],{},"Log 如下：",[40,2578,2580],{"className":42,"code":2579,"language":44,"meta":45,"style":45},"Created Wifi Info\nSSID:\"HADB-ASUS\"\npreSharedKey:*\nhiddenSSID:false\nallowedAuthAlgorithms:{}\nallowedGroupCiphers:{0, 1, 2, 3}\nallowedPairwiseCiphers:{1, 2}\nallowedProtocols:{0, 1}\nstatus:0\nbRet=true\n",[35,2581,2582,2591,2598,2603,2610,2615,2637,2650,2663,2670],{"__ignoreMap":45},[49,2583,2584,2587],{"class":51,"line":52},[49,2585,2586],{"class":55},"Created Wifi ",[49,2588,2590],{"class":2589},"sUdit","Info\n",[49,2592,2593,2595],{"class":51,"line":66},[49,2594,2305],{"class":55},[49,2596,2597],{"class":72},"\"HADB-ASUS\"\n",[49,2599,2600],{"class":51,"line":93},[49,2601,2602],{"class":55},"preSharedKey:*\n",[49,2604,2605,2607],{"class":51,"line":105},[49,2606,2370],{"class":55},[49,2608,2609],{"class":59},"false\n",[49,2611,2612],{"class":51,"line":122},[49,2613,2614],{"class":55},"allowedAuthAlgorithms:{}\n",[49,2616,2617,2620,2622,2624,2626,2628,2631,2633,2635],{"class":51,"line":134},[49,2618,2619],{"class":55},"allowedGroupCiphers:{",[49,2621,866],{"class":59},[49,2623,610],{"class":55},[49,2625,563],{"class":59},[49,2627,610],{"class":55},[49,2629,2630],{"class":59},"2",[49,2632,610],{"class":55},[49,2634,128],{"class":59},[49,2636,1414],{"class":55},[49,2638,2639,2642,2644,2646,2648],{"class":51,"line":154},[49,2640,2641],{"class":55},"allowedPairwiseCiphers:{",[49,2643,563],{"class":59},[49,2645,610],{"class":55},[49,2647,2630],{"class":59},[49,2649,1414],{"class":55},[49,2651,2652,2655,2657,2659,2661],{"class":51,"line":164},[49,2653,2654],{"class":55},"allowedProtocols:{",[49,2656,866],{"class":59},[49,2658,610],{"class":55},[49,2660,563],{"class":59},[49,2662,1414],{"class":55},[49,2664,2665,2667],{"class":51,"line":179},[49,2666,2557],{"class":55},[49,2668,2669],{"class":59},"0\n",[49,2671,2672,2675],{"class":51,"line":189},[49,2673,2674],{"class":55},"bRet=",[49,2676,2677],{"class":59},"true\n",[28,2679,2680,2681,2683,2684,2687,2688,2690,2691,2694],{},"当然，除了 ",[35,2682,2349],{}," 输出的是被隐藏了的 ",[35,2685,2686],{},"\"*\"","，因为安全性问题，密码是无法输出的，其它的项有的并不止一个值，后来看文档，发现，这些值其实都是有默认值的，根本不需要手动去设置它们，只需要将 ",[35,2689,2568],{}," 设为 ",[35,2692,2693],{},"WifiConfiguration.Status.ENABLED"," 就可以了，密码也是要设一下的，其它的都可以注释掉。",[28,2696,2697],{},"于是，问题完美解决了……啊哈哈哈哈……",[28,2699,2700],{},"这次也给了我自己一个经验，那就是别人的代码也不能完全相信，还是要自己亲自实践才行。但参考代码这个步骤是必须的，因为它能带给你无数的灵感，还能指引你方向，因为有时候你根本不知道从何下手，参考一些代码之后，就会大体了解怎么去做，需要引用哪些包，然后在对这些包进行搜索，查看官方文档，很快，问题就可以迎刃而解了。",[278,2702,2703],{},"html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sUdit, html code.shiki .sUdit{--shiki-light:#91B859;--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":45,"searchDepth":66,"depth":66,"links":2705},[],"2012-07-23","我项目中这部分的代码是参考的这里的：http:\u002F\u002Fblog.csdn.net\u002Fcscmaker\u002Farticle\u002Fdetails\u002F7032277",{},"\u002Fposts\u002F2012\u002Fandroid-wifi-connection",{"text":1424,"minutes":2711,"time":2712,"words":2713},2.355,141300,471,{"title":2034,"description":2707},{"loc":2709},"posts\u002F2012\u002F20120723.android-wifi-connection",[300,301],"下午","vJTWBkh4dzgDTGSPwDOD0eXCB_ihXjI_e_dOQMXLhOM",{"id":2721,"title":2722,"body":2723,"class":283,"cover":283,"coverSize":283,"date":2834,"description":2727,"draft":286,"extension":287,"hideComments":286,"location":2835,"meta":2836,"navigation":289,"path":2837,"readingTime":2838,"seo":2842,"sitemap":2843,"stem":2844,"tags":2845,"time":283,"weather":283,"__hash__":2846},"posts\u002Fposts\u002F2012\u002F20120702.set-eclipse-juno-for-android.md","Eclipse Juno 下搭建 Android 开发环境",{"type":25,"value":2724,"toc":2832},[2725,2728,2731,2740,2742,2745,2748,2751,2753,2756,2759,2762,2765,2768,2771,2780,2783,2786,2789,2792,2800,2803,2806,2809,2812,2815,2818,2821,2824],[28,2726,2727],{},"Eclipse 官方 28 日正式发布了 Eclipse 4.2，代号 Juno。同时，Eclipse 也宣布将使用 Eclipse 4.2 来开发以后的 Eclipse 版本。因此，在我升级 Eclipse 的同时，我也来制作一个 Juno 下搭建 Android 开发环境的教程，其实跟以往的教程是没多大区别的，只是比较新一点儿而已。",[28,2729,2730],{},"前提条件，安装了 java JDK，如何安装可以自己百度下。",[28,2732,2733,2734,2739],{},"首先，去 ",[269,2735,2738],{"href":2736,"rel":2737},"http:\u002F\u002Fwww.eclipse.org\u002F",[273],"Eclipse 官网"," 下载最新的 Eclipse 安装包。",[1997,2741],{"filename":1999},[28,2743,2744],{},"可以看到，首页已经变成了 Juno 的宣传。点击 Downloads 进入下载页面，我们选择 Eclipse IDE for Java Developers，其实也可以选择 Eclipse for Mobile Developers，他们相差不大。",[28,2746,2747],{},"下载好之后，解压就可以了。",[28,2749,2750],{},"打开 eclipse.exe，可以看到，新的 Logo：",[1997,2752],{"filename":2005},[28,2754,2755],{},"首先，会让你设置一个工作目录",[1997,2757],{"filename":2758},"03.png",[28,2760,2761],{},"自己设置一下，将下面的复选框打勾，也就是将这个目录作为默认工作目录，并不再提示，这样以后新建的项目都会在这个目录中。",[28,2763,2764],{},"好，我们进入到熟悉的欢迎界面：",[1997,2766],{"filename":2767},"04.png",[28,2769,2770],{},"下面我们来安装汉化包，我个人还是比较喜欢中文的界面，如果喜欢英文界面的朋友可以跳过这一步。",[28,2772,2773,2774,2779],{},"到 ",[269,2775,2778],{"href":2776,"rel":2777},"http:\u002F\u002Fbuild.eclipse.org\u002Ftechnology\u002Fbabel\u002Fbabel_language_packs\u002F",[273],"这里"," 可以找到 Babel 多语言项目的最新包，然后找到简体中文的部分：",[1997,2781],{"filename":2782},"05.png",[28,2784,2785],{},"下载对应的包，解压到 Eclipse 的安装位置，然后重启 Eclipse，就可以看到汉化之后的 Eclipse 界面了。",[1997,2787],{"filename":2788},"06.png",[28,2790,2791],{},"好，下面开始安装 Android 插件",[28,2793,2794,2795,2799],{},"到“帮助-安装新软件”里点击添加，然后如图输入 ",[269,2796,2797],{"href":2797,"rel":2798},"https:\u002F\u002Fdl-ssl.google.com\u002Fandroid\u002Feclipse\u002F",[273]," 这个地址",[1997,2801],{"filename":2802},"07.png",[28,2804,2805],{},"然后，选择 Developer Tools",[1997,2807],{"filename":2808},"08.png",[28,2810,2811],{},"然后就直接下一步下一步，有个地方 Agree 一下，然后就等待一会儿，下载安装。",[28,2813,2814],{},"安装完成之后重启一下 Eclipse。",[28,2816,2817],{},"你会发现多了些 Android 的东西，进入“窗口-首选项”，找到 Android 一栏：",[1997,2819],{"filename":2820},"09.png",[28,2822,2823],{},"由于我之前已经安装过 Android SDK，所以会有这些列表，如果你没有安装过 Android SDK，可以去下载一下，然后在这个 SDK Location 里选择你 SDK 所在的目录。",[28,2825,2826,2827],{},"嗯，至此，Juno 下搭建 Android 的开发环境就完成了，如果不够详细，可以再参考下面的文章：",[269,2828,2831],{"href":2829,"rel":2830},"http:\u002F\u002Fblog.csdn.net\u002Fwebrobot\u002Farticle\u002Fdetails\u002F7304831",[273],"Android 开发环境配置图文教程 (jdk + eclipse + android sdk)",{"title":45,"searchDepth":66,"depth":66,"links":2833},[],"2012-07-02","宿舍",{},"\u002Fposts\u002F2012\u002Fset-eclipse-juno-for-android",{"text":1424,"minutes":2839,"time":2840,"words":2841},2.95,177000,590,{"title":2722,"description":2727},{"loc":2837},"posts\u002F2012\u002F20120702.set-eclipse-juno-for-android",[300,301],"NVkTRjx9PgNmGCmdwr8JeX-JKYSvXEEiu9oyRhpSHcU",{"id":2848,"title":2849,"body":2850,"class":283,"cover":283,"coverSize":283,"date":2928,"description":2929,"draft":286,"extension":287,"hideComments":286,"location":283,"meta":2930,"navigation":289,"path":2931,"readingTime":2932,"seo":2936,"sitemap":2937,"stem":2938,"tags":2939,"time":283,"weather":283,"__hash__":2940},"posts\u002Fposts\u002F2012\u002F20120628.using-of-android-cleartaskonlaunch.md","android:clearTaskOnLaunch 的用法",{"type":25,"value":2851,"toc":2926},[2852,2859,2868,2871,2881,2884,2896,2906,2909,2912],[28,2853,2854,2855,2858],{},"关于 ",[35,2856,2857],{},"android:clearTaskOnLaunch","，网上的资料很少，唯一有几个资料，还说得很含糊，看着让人摸不着头脑，今天硬着头皮看了下英文文档，再结合自己的尝试，终于是稍微理解了它的用处。",[28,2860,2861,2862,2864,2865],{},"默认情况下，",[35,2863,2857],{}," 的值是 ",[35,2866,2867],{},"false",[28,2869,2870],{},"此时，比如你的应用里有 N 个 Activity，其中有个是设置页面，你从主页面进入到设置页面设置了一些东西之后，突然，按了下 Home 键，回到了 Android 的 Home，这时候你做了些别的事情，然后你再次点击你的应用程序图标进入你的应用程序的时候，依旧是回到设置页面，继续先前的工作，这也是大多数应用的情况。",[28,2872,2873,2874,2876,2877,2880],{},"但是，如果你把 ",[35,2875,2857],{}," 的值设为 ",[35,2878,2879],{},"true"," 呢？顾名思义，它就在启动的时候把 Task 给清空了，就是你再次点击应用程序图标进入你的应用程序的时候是回到应用程序的第一个页面，而不会回到先前的设置页面。也就是说不保存先前的设置状态。",[28,2882,2883],{},"至于，什么情况下要这么用，我还没想到，像谷歌的 Zxing 项目，也就是 Android 上的“条码扫描器”，它就是这样的，不管你什么时候重新进入该应用，它显示的都是扫描的界面。",[28,2885,2886,2887,2889,2890,2892,2893,2895],{},"不过呢，我也发现了个意外情况，就是即使你把 ",[35,2888,2857],{}," 的值设为了 ",[35,2891,2879],{},"，但是在 Home 界面长按 Home 键，可以调出一个你最近进行的任务，从那个里面点击你的应用是可以回到先前保留的状态的，也就是无视 ",[35,2894,2857],{}," 了，至于为什么，目前还没搞明白，有兴趣的可以去官方查看一下文档，我没有仔细去看。",[28,2897,2854,2898,2900,2901],{},[35,2899,2857],{}," 的 ",[269,2902,2905],{"href":2903,"rel":2904},"http:\u002F\u002Fdeveloper.android.com\u002Fintl\u002Fzh-CN\u002Fguide\u002Ftopics\u002Fmanifest\u002Factivity-element.html#clear",[273],"官方文档",[28,2907,2908],{},"另外，今天更新了下 ADT 20，感觉还不错，Windows 下模拟器的程序图标变了，比以前可爱了，呵呵。以前好像是没图标还是怎么地，完全没印象。这个图标倒还是让人印象深刻。",[28,2910,2911],{},"2012-07-02 补充：",[28,2913,2914,2915,2917,2918,2921,2922,2925],{},"前几天搞得焦头烂额，我下了一个开源的项目，在里面把所有的 ",[35,2916,2857],{}," 全部删除了，可结果还是重新进入的时候从第一个 Activity 开始，我就纳闷了，纠结了，百思不得其解，以为是应用程序更新的时候，有些地方没有完全更新，然后卸载了，重新安装调试，还是这样。没办法，认真检查所有代码，结果发现了这么个东西：",[35,2919,2920],{},"intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);"," 它在启动每个 Activity 的时候加了个 Flag，",[35,2923,2924],{},"Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET","，也达到了那样的效果，删掉，然后就是一般的效果了，也就是不管什么时候重新进入应用，进入的是先前停留的地方。嗯~搞定！",{"title":45,"searchDepth":66,"depth":66,"links":2927},[],"2012-06-28","关于 android:clearTaskOnLaunch，网上的资料很少，唯一有几个资料，还说得很含糊，看着让人摸不着头脑，今天硬着头皮看了下英文文档，再结合自己的尝试，终于是稍微理解了它的用处。",{},"\u002Fposts\u002F2012\u002Fusing-of-android-cleartaskonlaunch",{"text":2022,"minutes":2933,"time":2934,"words":2935},3.625,217500,725,{"title":2849,"description":2929},{"loc":2931},"posts\u002F2012\u002F20120628.using-of-android-cleartaskonlaunch",[300,301],"KvFbhSxGX4w8b_jobwii3Vfzp6OpZNY3mPRfL2pXZ7w",{"id":2942,"title":2943,"body":2944,"class":283,"cover":283,"coverSize":283,"date":3217,"description":3218,"draft":286,"extension":287,"hideComments":286,"location":2835,"meta":3219,"navigation":289,"path":3220,"readingTime":3221,"seo":3225,"sitemap":3226,"stem":3227,"tags":3228,"time":3229,"weather":283,"__hash__":3230},"posts\u002Fposts\u002F2012\u002F20120618.several-intent-filters-in-one-activity.md","Android 中一个 Activity 多个 intent-filter 的调用方法",{"type":25,"value":2945,"toc":3215},[2946,2953,2956,3109,3118,3121,3199,3209,3212],[28,2947,2948,2949,2952],{},"在 Android 中，Activity 允许有很多种调用方式，其中一个方法是使用 ",[35,2950,2951],{},"\u003Cintent-filter>","。",[28,2954,2955],{},"比如：",[40,2957,2959],{"className":1475,"code":2958,"language":1477,"meta":45,"style":45},"\u003Cintent-filter>\n    \u003Caction android:name=\"android.intent.action.VIEW\" \u002F>\n    \u003Ccategory android:name=\"android.intent.category.DEFAULT\" \u002F>\n    \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" \u002F>\n    \u003Cdata android:host=\"www.google.com\" android:path=\"m\u002Fproducts\u002Fscan\" android:scheme=\"http\" \u002F>\n\u003C\u002Fintent-filter>\n",[35,2960,2961,2971,2996,3020,3043,3100],{"__ignoreMap":45},[49,2962,2963,2965,2968],{"class":51,"line":52},[49,2964,1485],{"class":1484},[49,2966,2967],{"class":1488},"intent-filter",[49,2969,2970],{"class":1484},">\n",[49,2972,2973,2976,2979,2981,2983,2985,2987,2989,2992,2994],{"class":51,"line":66},[49,2974,2975],{"class":1484},"    \u003C",[49,2977,2978],{"class":1488},"action",[49,2980,1493],{"class":1492},[49,2982,1497],{"class":1496},[49,2984,1500],{"class":1492},[49,2986,733],{"class":1484},[49,2988,1505],{"class":900},[49,2990,2991],{"class":72},"android.intent.action.VIEW",[49,2993,1505],{"class":900},[49,2995,1513],{"class":1484},[49,2997,2998,3000,3003,3005,3007,3009,3011,3013,3016,3018],{"class":51,"line":93},[49,2999,2975],{"class":1484},[49,3001,3002],{"class":1488},"category",[49,3004,1493],{"class":1492},[49,3006,1497],{"class":1496},[49,3008,1500],{"class":1492},[49,3010,733],{"class":1484},[49,3012,1505],{"class":900},[49,3014,3015],{"class":72},"android.intent.category.DEFAULT",[49,3017,1505],{"class":900},[49,3019,1513],{"class":1484},[49,3021,3022,3024,3026,3028,3030,3032,3034,3036,3039,3041],{"class":51,"line":105},[49,3023,2975],{"class":1484},[49,3025,3002],{"class":1488},[49,3027,1493],{"class":1492},[49,3029,1497],{"class":1496},[49,3031,1500],{"class":1492},[49,3033,733],{"class":1484},[49,3035,1505],{"class":900},[49,3037,3038],{"class":72},"android.intent.category.BROWSABLE",[49,3040,1505],{"class":900},[49,3042,1513],{"class":1484},[49,3044,3045,3047,3050,3052,3054,3057,3059,3061,3064,3066,3068,3070,3073,3075,3077,3080,3082,3084,3086,3089,3091,3093,3096,3098],{"class":51,"line":122},[49,3046,2975],{"class":1484},[49,3048,3049],{"class":1488},"data",[49,3051,1493],{"class":1492},[49,3053,1497],{"class":1496},[49,3055,3056],{"class":1492},"host",[49,3058,733],{"class":1484},[49,3060,1505],{"class":900},[49,3062,3063],{"class":72},"www.google.com",[49,3065,1505],{"class":900},[49,3067,1493],{"class":1492},[49,3069,1497],{"class":1496},[49,3071,3072],{"class":1492},"path",[49,3074,733],{"class":1484},[49,3076,1505],{"class":900},[49,3078,3079],{"class":72},"m\u002Fproducts\u002Fscan",[49,3081,1505],{"class":900},[49,3083,1493],{"class":1492},[49,3085,1497],{"class":1496},[49,3087,3088],{"class":1492},"scheme",[49,3090,733],{"class":1484},[49,3092,1505],{"class":900},[49,3094,3095],{"class":72},"http",[49,3097,1505],{"class":900},[49,3099,1513],{"class":1484},[49,3101,3102,3105,3107],{"class":51,"line":134},[49,3103,3104],{"class":1484},"\u003C\u002F",[49,3106,2967],{"class":1488},[49,3108,2970],{"class":1484},[28,3110,3111,3112,3117],{},"一开始我以为，在浏览器中键入 “",[269,3113,3116],{"href":3114,"rel":3115},"http:\u002F\u002Fwww.google.com\u002Fm\u002Fproducts\u002Fscan%E2%80%9D",[273],"http:\u002F\u002Fwww.google.com\u002Fm\u002Fproducts\u002Fscan”"," 就可以调用了的，结果发现浏览器只是正常打开它 T.T",[28,3119,3120],{},"后来发现，它的调用仍然需要使用 intent。",[40,3122,3124],{"className":1715,"code":3123,"language":1717,"meta":45,"style":45},"Uri uri = Uri.parse(\"http:\u002F\u002Fwww.google.com\u002Fm\u002Fproducts\u002Fscan\");\nIntent it = new Intent(Intent.ACTION_VIEW, uri);\nstartActivity(it);\n",[35,3125,3126,3155,3187],{"__ignoreMap":45},[49,3127,3128,3131,3134,3136,3139,3141,3144,3146,3148,3151,3153],{"class":51,"line":52},[49,3129,3130],{"class":1754},"Uri",[49,3132,3133],{"class":55}," uri ",[49,3135,733],{"class":356},[49,3137,3138],{"class":55}," Uri",[49,3140,1397],{"class":1484},[49,3142,3143],{"class":480},"parse",[49,3145,495],{"class":1484},[49,3147,1505],{"class":900},[49,3149,3150],{"class":72},"http:\u002F\u002Fwww.google.com\u002Fm\u002Fproducts\u002Fscan",[49,3152,1505],{"class":900},[49,3154,1832],{"class":1484},[49,3156,3157,3160,3163,3165,3168,3171,3173,3175,3177,3180,3182,3185],{"class":51,"line":66},[49,3158,3159],{"class":1754},"Intent",[49,3161,3162],{"class":55}," it ",[49,3164,733],{"class":356},[49,3166,3167],{"class":553}," new",[49,3169,3170],{"class":480}," Intent",[49,3172,495],{"class":1484},[49,3174,3159],{"class":55},[49,3176,1397],{"class":1484},[49,3178,3179],{"class":55},"ACTION_VIEW",[49,3181,1822],{"class":1484},[49,3183,3184],{"class":55}," uri",[49,3186,1832],{"class":1484},[49,3188,3189,3192,3194,3197],{"class":51,"line":93},[49,3190,3191],{"class":480},"startActivity",[49,3193,495],{"class":1484},[49,3195,3196],{"class":55},"it",[49,3198,1832],{"class":1484},[28,3200,3201,3202,3205,3206,3208],{},"我是在一个 Button 的 ",[35,3203,3204],{},"onClick()"," 方法里写的这些代码，这样按这个按钮，就会调用所有符合要求的含有对应 ",[35,3207,2951],{}," 的 Activity，在我的手机里，有 Chrome Beta、浏览器、快拍二维码、条码扫描器，以及我刚刚创建那个应用的 Activity。",[28,3210,3211],{},"嗯嗯，记录一下，以后会经常把日常遇到的问题记下来，方便遇到同样问题的开发者们一起学习！",[278,3213,3214],{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_bVq, html code.shiki .s_bVq{--shiki-light:#9C3EDA;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"title":45,"searchDepth":66,"depth":66,"links":3216},[],"2012-06-18","在 Android 中，Activity 允许有很多种调用方式，其中一个方法是使用 \u003Cintent-filter>。",{},"\u002Fposts\u002F2012\u002Fseveral-intent-filters-in-one-activity",{"text":292,"minutes":3222,"time":3223,"words":3224},1.08,64800,216,{"title":2943,"description":3218},{"loc":3220},"posts\u002F2012\u002F20120618.several-intent-filters-in-one-activity",[300,301],"23:13","9WJHWggq3x34OYTuv-1vBdW_1i6CnPU1f0fkhoyDwaI",{"id":3232,"title":3233,"body":3234,"class":283,"cover":283,"coverSize":283,"date":3241,"description":3238,"draft":286,"extension":287,"hideComments":286,"location":283,"meta":3242,"navigation":289,"path":3243,"readingTime":3244,"seo":3248,"sitemap":3249,"stem":3250,"tags":3251,"time":3252,"weather":283,"__hash__":3253},"posts\u002Fposts\u002F2012\u002F20120323.eclipse-not-display-code-hint.md","【已解决】Eclipse 代码提示不显示的问题",{"type":25,"value":3235,"toc":3239},[3236],[28,3237,3238],{},"前些时候重装了系统，在备份 Android SDK 和 Eclipse 的时候出了问题，然后只能重新下载，SDK 下得我都要吐血了，超慢。然后，我发现 Eclipse 有了新版本的，于是就下载了个新版的，结果出了问题了。所有的 Android 代码都没有了代码自动提示了，按 Alt+\u002F，弹出的框里面什么也没有。苦恼了很久，以为是少装了些什么。网上也查了很久，无果。后来在“Windows\u002FPreference\u002FJava\u002FEditor\u002FContent Assist\u002FAdvanced”下面发现了些端倪，没有勾选 Java Proposals，我就很奇怪，然后打开室友的 Eclipse，他的版本跟我之前的版本是一样的，我发现，同样的地方，他选择的是 Java Proposals(Task-Focused)，而 Java Proposals 也没有勾选。而我的新版本里面没有 Java Proposals(Task-Focused)。问题找到了，由于我的配置是使用的之前版本的配置，所以就导致了没有选中 Java Proposals，至于那个(Task-Focused)是什么，还没搞懂……不过，至少我的代码提示是回来了，哈哈哈！可以继续编程了！",{"title":45,"searchDepth":66,"depth":66,"links":3240},[],"2012-03-23",{},"\u002Fposts\u002F2012\u002Feclipse-not-display-code-hint",{"text":292,"minutes":3245,"time":3246,"words":3247},1.385,83100,277,{"title":3233,"description":3238},{"loc":3243},"posts\u002F2012\u002F20120323.eclipse-not-display-code-hint",[300,301],"10:39","JD3IkDXryji0MeJ8n7XLoW1nXZXXVdyEXb5z5bEC93k",1777580268625]