編輯:關於Android編程
前言
成功的產品往往在細節之處也做到極致,產品和項目從使用的角度來看最大的區別我認為也就是細節的處理上。開播視頻的目標是產品,前面7篇文章高歌猛進,添加了很多的功能,也該停下來休整一下,優化一下,也歡迎交流反饋做得不周到的地方。由於開源,大家也可以按照自己的喜好來添加修改不同的功能和細節。
系列
1、Android 使用Vitamio打造自己的萬能播放器(1)——准備
2、Android 使用Vitamio打造自己的萬能播放器(2)—— 手勢控制亮度、音量、縮放
3、Android 使用Vitamio打造自己的萬能播放器(3)——本地播放(主界面、視頻列表)
4、Android 使用Vitamio打造自己的萬能播放器(4)——本地播放(快捷搜索、數據存儲)
5、Android 使用Vitamio打造自己的萬能播放器(5)——在線播放(播放優酷視頻)
6、Android 使用Vitamio打造自己的萬能播放器(6)——在線播放(播放列表)
7、Android 使用Vitamio打造自己的萬能播放器(7)——在線播放(下載視頻)
正文
一、更新日志
1. 新增:顯示SDCard剩余空間
如果SD卡容量有限,而且經常使用下載視頻,對剩余空間比較關注。如圖:

代碼網上找的,也有在項目裡用過的:
public static String showFileSize(long size) {
String fileSize;
if (size < KB)
fileSize = size + "B";
else if (size < MB)
fileSize = String.format("%.1f", size / KB) + "KB";
else if (size < GB)
fileSize = String.format("%.1f", size / MB) + "MB";
else
fileSize = String.format("%.1f", size / GB) + "GB";
return fileSize;
}
/** 顯示SD卡剩余空間 */
public static String showFileAvailable() {
String result = "";
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
StatFs sf = new StatFs(Environment.getExternalStorageDirectory().getPath());
long blockSize = sf.getBlockSize();
long blockCount = sf.getBlockCount();
long availCount = sf.getAvailableBlocks();
return showFileSize(availCount * blockSize) + " / " + showFileSize(blockSize * blockCount);
}
return result;
}
2. 改進:加載網頁時顯示正在加載效果
未改之前每次進入網頁都會空白一片,加載完後才顯示出來,體驗較差。
3. 改進:在線視頻欄目在多個網站之間切換時後退混亂的問題
未改前使用WebView默認的前進後退功能,使用中發現切換後還是會出現後退混亂的狀況。注意clearHistory不能清除當前的url。修改參照帖子,這裡。 注意需要判斷鏈接是否相同,即:
if (!mHistory.contains(url)) mHistory.add(0, url);
4. 新增:顯示正在加載的url

5. 新增:刪除、重命名視頻文件
基礎功能:
/** 刪除文件 */
private void deleteFile(final FileAdapter adapter, final PFile f, final int position) {
new AlertDialog.Builder(getActivity()).setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.file_delete).setMessage(getString(R.string.file_delete_confirm, f.title)).setNegativeButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
File file = new File(f.path);
if (file.canRead() && file.exists())
file.delete();
FileBusiness.deleteFile(getActivity(), f);
adapter.delete(position);
} catch (Exception e) {
}
}
}).setPositiveButton(android.R.string.no, null).show();
}
/** 重命名文件 */
private void renameFile(final FileAdapter adapter, final PFile f, final int position) {
final EditText et = new EditText(getActivity());
et.setText(f.title);
new AlertDialog.Builder(getActivity()).setTitle(R.string.file_rename).setIcon(android.R.drawable.ic_dialog_info).setView(et).setNegativeButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String name = et.getText().toString().trim();
if (name == null || name.trim().equals("") || name.trim().equals(f.title))
return;
try {
File fromFile = new File(f.path);
File nf = new File(fromFile.getParent(), name.trim());
if (nf.exists()) {
Toast.makeText(getActivity(), R.string.file_rename_exists, Toast.LENGTH_LONG).show();
} else if (fromFile.renameTo(nf)) {
f.title = name;
f.path = nf.getPath();
FileBusiness.renameFile(getActivity(), f);
adapter.notifyDataSetChanged();
}
} catch (SecurityException se) {
Toast.makeText(getActivity(), R.string.file_rename_failed, Toast.LENGTH_LONG).show();
}
}
}).setPositiveButton(android.R.string.no, null).show();
}
6. 修正:使用WebView播放視頻時無法關閉的問題
使用浏覽器的flash插件播放視頻時可能會有此問題。
7. 改進:下載視頻顯示對應視頻標題名稱
未改前下載視頻為一長串數字。
三、下載
至本章節往後,代碼均不再提供下載,請移步Google Code:
http://code.google.com/p/android-oplayer
無法訪問請嘗試地址:https://over140@android-oplayer.googlecode.com/hg/ ,參照這裡。
以上就是對Android Vitamio開發播放器細節優化部分,後續繼續補充。
Android百度定位導航之基於百度地圖移動獲取位置和自動定位
一、問題描述使用百度地圖實現如圖所示應用,首先自動定位當前我起始位置(小圓點位置),並跟隨移動不斷自動定位我的當前位置百度Api不同版本使用會有些差異,本例中加入lib如
java/android 設計模式學習筆記(15)---責任鏈模式
這篇博客我們來介紹一下責任鏈模式(Chain-of-responsibility Pattern),責任聯模式又稱為職責鏈模式,是行為型設計模式之一。顧名思義,責任鏈模式
Android--藍牙操作(藍牙的打開與關閉,可見性的打開與關閉)
BluetoothAdapter 用法藍牙運行原理:通過BluetoothAdapter 藍牙適配器處理任務,如果藍牙被啟動之後,系統會自動去搜索其它
Launcher3--拖拽
在Launcher3中,有三處長按拖拽處理:主屏幕(Workspace)上的圖標和小部件文件夾中的圖標抽屜中的圖標和小部件這三種情況的拖拽處理是相似的的,我們只需知道其中