欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Android多媒體

Android多媒體

通過(guò)調用Android的API,可以實(shí)現相冊,播放器,錄音和攝像等功能。這一章需要掌握如下功能:

q      多媒體的ContentProvider的調用

q      Camera

q      AudioRecord和AudioTrack

q      MediaPlayer

  11.1  獲取多媒體信息

多媒體信息?在pc中的音樂(lè )播放器總是很容易的顯示歌手名、歌曲名、專(zhuān)輯名、年代。在A(yíng)ndroid中應該如何獲取這些信息呢?

11.1.1  查看多媒體ContentProvider

前面我們學(xué)習了ContentProvider來(lái)保存和檢索數據,Android為常用的數據類(lèi)型(如:音視頻、圖片和聯(lián)系方式等)提供了大量的ContentProvider,它們被定義在android.provider包下。那么我們如何獲取多媒體的ContentProvider呢。

(1)       在Eclipse中添加Android自帶的FileExplorer視圖:

菜單欄->window->show view->other->Android->FileExplorer

(2)       開(kāi)啟模擬器,在FileExplorer中查看data/data/com.android.providers.media/databases/(如圖11.1)

(3)       將external.db文件 pull到pc上,用sqlite工具(可以使用火狐插件SQliteManager)查看:(如圖11.2)

(4)       查看表結構:

audio_meta:管理sd卡中的音頻資源。(如圖11.3)

video:管理sd卡中的視頻資源。(如圖11.4)

images:管理sd卡中的圖片。(如圖11.5)

 

 

圖11.1  多媒體數據庫所在包

 

圖11.2  多媒體數據庫表

 

 

圖11.3  音頻表結構(audio_meta)

 

圖11.4  視頻表結構(video)

 

圖11.5  圖片表結構(images)

可能大家看到這里會(huì )不明白為什么講多媒體先要介紹這些。筆者這里給大家列舉一個(gè)音樂(lè )播放器的需求:

1)      獲得音樂(lè )文件列表及路徑

2)      獲得音樂(lè )文件屬性(歌曲名、歌手名、專(zhuān)輯、年代。。)

3)      手動(dòng)刪除內存卡中音樂(lè )文件,如何能同步更新文件列表

如果是沒(méi)有Android經(jīng)驗,大家可能會(huì )這樣分析:

       文件路徑嘛,我調用file.listFile()就可以得到音樂(lè )文件列表。如果內存卡里有很多文件,那么這個(gè)將會(huì )特別的耗時(shí),如果讓用戶(hù)等上10秒去掃描存儲卡,用戶(hù)很有可能將你的應用卸載掉。

       音樂(lè )文件屬性一般保存在音樂(lè )文件中,有的放在文件頭,有的放在文件尾,必須讀出該文件相關(guān)字節中的內容才可以獲取音樂(lè )文件信息。OK,有個(gè)開(kāi)源的項目,可以解析MP3文件中的文件信息。但是它同樣也是耗時(shí)的操作。而且學(xué)會(huì )調用這個(gè)開(kāi)源項目還需要一周的時(shí)間。做一個(gè)項目沒(méi)那么難吧?

       在文件管理器中手動(dòng)刪除或添加一個(gè)音樂(lè )文件,這個(gè)時(shí)候如何把它更新到音樂(lè )列表中呢,當你選擇一首歌播放的時(shí)候,很有可能已經(jīng)被刪掉了??偛荒茏屗鼤r(shí)刻去調用file.listFile()去維護吧?

       那么我們到底應該怎么做呢?你要始終相信Android是強大的,它早已為我們提供了這些功能,我們只需要調用Android提供的API,就可以解決上述的需求。

       現在我們先看個(gè)圖,圖11.6為模擬器開(kāi)機時(shí),在log中打印的日志。

 

圖11.6  開(kāi)機時(shí)的log

大家會(huì )看到,系統會(huì )調用MediaScanner去掃描Internal和External Volume。原來(lái),在開(kāi)機時(shí),系統會(huì )在后臺掃描內存和外存設備,將多媒體數據更新到數據庫中。同時(shí)也會(huì )掃描文件信息,這樣,我們不費吹灰之力就解決了問(wèn)題。

小插曲:之前由于筆者還不知道這個(gè)方法,在摸索中讓同事去研究解析MP3文件信息,花了他一個(gè)星期時(shí)間,當他做出來(lái)了,我花了十分鐘找到了這個(gè)方法。真是罪過(guò)罪過(guò)。

那么我們如何得到多媒體數據呢,請看下面的例子:

/**

      * 讀取sd卡中的音樂(lè )文件

      * @return

      * @throws Exception

      */

     public static ArrayList<Song> readDataFromSD(Context context,int component){

//       Log.i(TAG, "scanFile");

         Cursor cursor = context.getContentResolver().query(

                   MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,

                   new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA}

                   , MediaStore.Audio.Media.MIME_TYPE+"=? or " + MediaStore.Audio.Media.MIME_TYPE+"=?", new String[]{"audio/mpeg","audio/x-ms-wma"},null);

         ArrayList<Song> songs = null;

         if (cursor.moveToFirst()) {

              songs = SongInfoUtil.getList(cursor, context, component);

         }

         return songs;

     }

 

 

/**

 * @author stayzhang 封裝信息至Song

 */

public class SongInfoUtil {

//   private static final String TAG = "ListUtils";

     public static ArrayList<Song> getList(Cursor cursor, Context mContext, int component) {

         Song song = null;

         do {

//            Log.i(TAG, "getList");

              song = new Song();

              song.setFilename(cursor.getString(1));//文件名

              song.setTitle(cursor.getString(2));//歌曲名

              song.setDuration(cursor.getInt(3));//時(shí)長(cháng)

              song.setSinger(cursor.getString(4));//歌手名

              song.setAlbum(cursor.getString(5));//專(zhuān)輯名

              if (cursor.getString(6) != null) {//年代

                   song.setYear(cursor.getString(6));

              } else {

                   song.setYear("未知");

              }

              if ("audio/mpeg".equals(cursor.getString(7).trim())) {//歌曲格式

                   song.setType("mp3");

              } else if ("audio/x-ms-wma".equals(cursor.getString(7).trim())) {

                   song.setType("wma");

              }

              if (cursor.getString(8) != null) {//文件大小

                   float temp = cursor.getInt(8) / 1024f / 1024f;

                   String sizeStr = (temp + "").substring(0, 4);

                   song.setSize(sizeStr + "M");

              } else {

                   song.setSize("未知");

              }

              if (cursor.getString(9) != null) {//文件路徑

                   song.setFileUrl(cursor.getString(9));

              }

         } while (cursor.moveToNext());

         cursor.close();

         return dbService.query(component, null, null);

     }

}

同理,圖片還有視頻文件也可以這樣獲得,不再贅述。

這樣第一個(gè)和第二個(gè)需求我們已經(jīng)解決,那第三個(gè)需求呢。

當我們手動(dòng)的刪除或添加多媒體文件到存儲卡中時(shí),Android會(huì )自動(dòng)掃描這些文件并將其更新到數據庫嗎?

答案是不會(huì ),那么我們如何將數據實(shí)時(shí)更新到數據庫中呢。還記得logcat中打印出來(lái)的MediaScanner嗎?我們也可以調用MediaScanner這個(gè)類(lèi)去掃描存儲卡。但是不能直接調用這個(gè)類(lèi),只能以廣播的形式通知系統,讓系統去掃描存儲卡指定的URI,掃描完后,再通過(guò)ContentProvider查詢(xún)數據庫。

方法如下:

/**

          * 調用系統api掃描sd卡

          */

         private void scanSdCard() {

                   IntentFilter intentFilter = new IntentFilter(

                                     Intent.ACTION_MEDIA_SCANNER_STARTED);

                   intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);

                   intentFilter.addDataScheme("file");

                   scanReceiver = new ScanSdFilesReceiver();

                   registerReceiver(scanReceiver, intentFilter);

                   sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,

                                     Uri.parse("file://" + getExternalStorageDirectory().getAbsolutePath)));

         }

 

         /**

          * @author stayzhang 注冊?huà)呙栝_(kāi)始/完成的廣播

          */

         private class ScanSdFilesReceiver extends BroadcastReceiver {

                   public void onReceive(Context context, Intent intent) {

                            String action = intent.getAction();

                            if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)) {

//當系統開(kāi)始掃描sd卡時(shí),為了用戶(hù)體驗,可以加上一個(gè)等待框

                                     scanHandler.sendEmptyMessage(STARTED);

                            }

                            if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {

                            //當系統掃描完畢時(shí),停止顯示等待框,并重新查詢(xún)ContentProvider

                                     scanHandler.sendEmptyMessage(FINISHED);

                            }

                   }

         }

OK,關(guān)于多媒體的ContentProvider的知識告一段落,下面就是如何調用Android API來(lái)使用這些多媒體文件。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Android獲取本地音樂(lè )列表
Android平臺中應該如何獲取音樂(lè )文件的信息
Android設置鈴聲分析
Android 仿QQ、新浪相冊的實(shí)現
ContentProvider
Android開(kāi)發(fā)筆記(五十四)數據共享接口ContentProvider
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久