<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                轉載請注明出處:[http://blog.csdn.net/dmk877/article/details/50518464](http://blog.csdn.net/dmk877/article/details/50518464) 相關文章:[Android開發之內容提供者——創建自己的ContentProvider(詳解)](http://blog.csdn.net/dmk877/article/details/50387741) 忍耐和堅持雖是痛苦的事情,但卻能漸漸地為你帶來好處.——奧維德。 可能在堅持一件事情一段時間后,我們腦海中會有很多放棄的念頭,可能在放棄之后的幾年后,我們會想如果當時堅持下來會怎么怎么樣。。。,但是可惜的是我們沒有堅持。最近比較懶,也在這里提醒自己,不要迷失自己,堅持學習。 在上一篇我們講到了如何創建自己的ContentProvider,如果你掌握了上一篇所講的內容,那么相信今天這一篇,你會很輕松的掌握。這一篇的主要內容就是調用谷歌工程師給我們提供好的ContentProvider,也就是說谷歌定義好一個ContentProvider后會給我們一個Uri,我們拿著這個Uri就可以得到相應的數據。如果你沒調用過系統的Uri,沒有關系,今天我們會通過一個案例來詳細講解怎么調用。廢話不多說進入正題,如有謬誤歡迎批評指正,如有疑問歡迎留言。 ? ?通過本篇博客你將學到以下知識點 ? ?①如何調用系統的ContentProvider ? ?②如何通過谷歌給我們的Uri獲得短信的數據 ? ?③一個案例將手機中的短信進行備份和恢復 **1、如何調用系統的ContentProvider** 其實閱讀了上一篇文章之后,這個問題會很好的理解,谷歌工程師在將ContentProvider寫好之后,肯定會給我們一個Uri,只要知道這個Uri,我們就可以拿到我們需要的數據,比方說你想獲得手機短信的信息,那么必定有和其對應的Uri,你想獲得圖庫、聯系人信息,也必定有相應的Uri與之對應。知道對應的Uri后,就可以過ContentResolver這個對象,根據Uri進行數據訪問。更多的內容請參考:[Android開發之內容提供者——創建自己的ContentProvider(詳解)](http://blog.csdn.net/dmk877/article/details/50387741),今天的主要任務就是完成一個案例獲取系統的短信數據。 **2、案例(手機短信數據的獲取,以及備份和恢復)** 接下來我們就來看一個案例,這個案例的主要功能就是根據Uri獲取手機短信的信息,并將其備份和恢復,它的效果圖如下: ![](https://box.kancloud.cn/2016-03-01_56d500e41db07.jpg) 這個圖片演示了這樣一種功能,首先在DDMS中向模擬器中發幾條短信,然后運行我們的程序,點擊備份,提示備份成功后,將所有的短信刪除,然后在我們的程序中點擊恢復,打開短信界面發現剛才刪除的短信已經恢復,這就是我們要實現的功能 首先來分析一下怎么實現上述效果,如果想備份短信,首先要做的就是獲取短信的列表,這一步比較簡單因為谷歌已經將其封裝好,我們所要做的就是用Uri去查詢短信庫,就O了,然后拿到數據后需要將數據以XML的形式保存到SD卡里面,當然你用其它的方式也可以,只要能將其恢復就行。最后恢復的時候將指定路徑的XML文件解析,根據Uri將解析的短信數據插入到系統的短信列表中。思路就是這樣一個思路。沒有看懂沒關系,下面會有源碼以及對它們的分析。 了解了大概思路后,另一個重要的任務就是看看短信的表結構在模擬器中它的路徑是data->data->com.android.providers.telephony->databases下,如下圖 ![](https://box.kancloud.cn/2016-03-01_56d500e5c6252.jpg) 將其導出然后用Sqlite數據打開可以看到數據的結構如下,這里只關心threads表和sms表就夠了 threads表的結構如下 ![](https://box.kancloud.cn/2016-03-01_56d500e5d6b82.jpg) 其中 _id:用于區分不同的電話號碼,系統會為不同的電話號碼分配不同的_id。 date:收到信息的時間(如果收到來自同一個phone number多條信息,并且有對于一條信息未讀,那么date表示收到的最后一條信息時的時間) message_count:收到的信息的數目 read: 0.?代表未讀。?1.代表?已讀 對于其它字段一般很少用到,這里就不多做介紹了, sms表的結構如下 ![](https://box.kancloud.cn/2016-03-01_56d500e5e9241.jpg) 其中 _id:用于區分不同的短信 date:?該條短信接收的時間 read: 0表未讀,1表已讀 body:?表示具體的短信內容 到這里準備工作還差一步就可以進行代碼的書寫了,哪一步呢?就是訪問這個數據庫的Uri,對于訪問手機短信的Uri主要有以下這么幾個 content://sms/ ? ? ? ? ? 所有短信 content://sms/inbox ? ? ?收件箱 content://sms/sent ? ? ? 已發送 content://sms/draft ? ? ?草稿 content://sms/outbox??? ?發件箱 content://sms/failed ? ? 發送失敗 content://sms/queued ? ? 待發送列表 ? ? ? ? ? ?在這個案例中我們用content://sms/,因為是備份肯定是備份所有的短信,好了,下面一起來看看代碼吧。首先要做的就是根據Uri獲取短信的列表,這里新建一個SmsManage類,將備份和恢復的方法放到這個類中,獲取短信列表的代碼如下 ~~~ /** * 獲取短信列表 * @return */ public List<SmsData> getSmsList() { //獲取所有短信的 Uri Uri uri = Uri. parse( "content://sms/"); //獲取ContentResolver對象 ContentResolver contentResolver = mContext.getContentResolver(); //根據Uri 查詢短信數據 Cursor cursor = contentResolver.query(uri, null, null, null, null); if ( null != cursor) { Log. i( TAG, "cursor.getCount():" + cursor.getCount()); //根據得到的Cursor一條一條的添加到smsList(短信列表)中 while (cursor.moveToNext()) { int _id = cursor.getInt(cursor.getColumnIndex("_id" )); int type = cursor.getInt(cursor.getColumnIndex("type" )); String address = cursor.getString(cursor.getColumnIndex( "address")); String body = cursor.getString(cursor.getColumnIndex("body" )); String date = cursor.getString(cursor.getColumnIndex("date" )); SmsData smsData = new SmsData(_id, type, address, body, date); smsList.add(smsData); } cursor.close(); } return smsList; } ~~~ 可以看到上述代碼就是根據content://sms/這個Uri去查詢手機中短信的數據庫,得到一個Cursor這個Cursor就包含了一條一條的短信。然后去遍歷這個Cursor將我們需要的數據添加到smsList中。這樣短信數據就拿到了,因為我們做的功能是短信備份,所以接下來需要將smsList這個集合中的數據保存到本地,以方便短信恢復的時候去讀取保存的這個文件,那么問題來了,怎樣將smsList這個集合以文件的形式保存到本地呢?當然方法有很多,這里我們采用的是使用XmlSerializer將其序列化,待我們需要恢復的時候使用XmlPullParser?將其反序列化,就可以拿到備份的數據,聽起來感覺挺高大上的,其實很簡單就是對xml的操作。下面來看看序列化的代碼即將上面得到的集合smsList中的數據生成一個xml文件,并保存到本地,代碼如下 ~~~ /** * 將短信數據保存到 sd卡中 */ public void saveSmsToSdCard(){ smsList=getSmsList(); //獲得一個序列化對象 XmlSerializer xmlSerializer=Xml. newSerializer(); //將生成的 xml文件保存到sd 卡中名字為"sms.xml" File file= new File(Environment.getExternalStorageDirectory(), "sms.xml"); FileOutputStream fos; try { fos = new FileOutputStream(file); xmlSerializer.setOutput(fos, "utf-8"); xmlSerializer.startDocument( "utf-8", true); xmlSerializer.startTag( null, "smss"); xmlSerializer.startTag( null, "count"); xmlSerializer.text( smsList.size()+ ""); xmlSerializer.endTag( null, "count"); for(SmsData smsData: smsList){ xmlSerializer.startTag( null, "sms"); xmlSerializer.startTag( null, "_id"); xmlSerializer.text(smsData.get_id()+ ""); System. out.println( "smsData.get_id()=" +smsData.get_id()); xmlSerializer.endTag( null, "_id"); xmlSerializer.startTag( null, "type"); xmlSerializer.text(smsData.getType()+ ""); System. out.println( "smsData.getType=" +smsData.getType()); xmlSerializer.endTag( null, "type"); xmlSerializer.startTag( null, "address"); xmlSerializer.text(smsData.getAddress()+ ""); System. out.println( "smsData.getAddress()=" +smsData.getAddress()); xmlSerializer.endTag( null, "address"); xmlSerializer.startTag( null, "body"); xmlSerializer.text(smsData.getBody()+ ""); System. out.println( "smsData.getBody()=" +smsData.getBody()); xmlSerializer.endTag( null, "body"); xmlSerializer.startTag( null, "date"); xmlSerializer.text(smsData.getDate()+ ""); System. out.println( "smsData.getDate()=" +smsData.getDate()); xmlSerializer.endTag( null, "date"); xmlSerializer.endTag( null, "sms"); } xmlSerializer.endTag( null, "smss"); xmlSerializer.endDocument(); fos.flush(); fos.close(); Toast. makeText( mContext, "備份完成", Toast.LENGTH_SHORT ).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } ~~~ 通過調用以上方法就將短信以xml的形式保存到了本地。運行這個方法后可以再sd卡中看到sms.xml文件,將其導出來可以看到它的格式如下 ![](https://box.kancloud.cn/2016-03-01_56d500e608b1f.jpg) 注:實際上xml文件中它是一行這里為了讓大家更清楚的看清結構,我手動將其改成上述格式了。 保存到本地后,工作就剩下最后一步了,那就是將這個xml文件反序列化,并將其中的數據一條一條插入到短信的數據庫中,與其對應的代碼如下 ~~~ /** * 將指定路徑的 xml文件中的數據插入到短信數據庫中 * @param path */ public void restoreSms(String path) { File file = new File(path); //得到一個解析 xml的對象 XmlPullParser parser = Xml. newPullParser(); try { fis = new FileInputStream(file); parser.setInput( fis, "utf-8"); ContentValues values = null; int type = parser.getEventType(); while (type != XmlPullParser. END_DOCUMENT) { switch (type) { case XmlPullParser. START_TAG: if ( "count".equals(parser.getName())) { } else if ("sms" .equals(parser.getName())) { values = new ContentValues(); } else if ("type" .equals(parser.getName())) { values.put( "type", parser.nextText()); } else if ("address" .equals(parser.getName())) { values.put( "address", parser.nextText()); } else if ("body" .equals(parser.getName())) { values.put( "body", parser.nextText()); } else if ("date" .equals(parser.getName())) { values.put( "date", parser.nextText()); } break; case XmlPullParser. END_TAG: if ( "sms".equals(parser.getName())) {// 如果節點是 sms Uri uri = Uri.parse( "content://sms/"); ContentResolver resolver = mContext.getContentResolver(); resolver.insert(uri, values);//向數據庫中插入數據 System. out.println( "插入成功" ); values = null; // } break; } type=parser.next(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } ~~~ 可以看到在上述方法中判斷xml的END_TAG是不是"sms"如果是的話說明一條短信的"type"、"address"、"body"、"date"這些信息已經拿到,然后就根據Uri將這條數據插入到數據庫中,就完成一條短信的恢復,待讀到?*END_DOCUMENT*說明xml文件已經讀完,此時所備份的短信就全部恢復了。 好了今天這篇文章就到這里了,如果發現文章中的錯誤,歡迎指出,如果有疑問請留言,謝謝。如果你覺的本篇文章對你有幫助,就贊一下,頂一個唄,謝謝您的支持。 [源碼下載點這里](http://download.csdn.net/detail/dmk877/9404958) 轉載請注明出處:[http://blog.csdn.net/dmk877/article/details/50518464](http://blog.csdn.net/dmk877/article/details/50518464)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看