try{
Bitmap _IMG = ((BitmapDrawable) view.getDrawable()).getBitmap();
if(_IMG != null && !_IMG.isRecycled())
{
_IMG.recycle();
}
if(resource != -1) view.setImageResource(resource);
else view.setImageDrawable(null);
}catch (NullPointerException e){}
4.01.2016
Android ImageView 設為空
原本的ImageView有塞圖,要將它清空:
8.07.2015
Android Studio build error - Error:Android Dex: [...] Unable to execute DX
Error:Android Dex: [EdiLife] Unable to execute DX
Error:Android Dex: [EdiLife] com.android.dex.DexException: Multiple dex files define Lcom/google/android/gcm/GCMBaseIntentService;
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
Error:Android Dex: [EdiLife] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
Error:Android Dex: [EdiLife] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
Error:Android Dex: [EdiLife] at com.android.dx.command.dexer.Main.run(Main.java:230)
Error:Android Dex: [EdiLife] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error:Android Dex: [EdiLife] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Error:Android Dex: [EdiLife] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Error:Android Dex: [EdiLife] at java.lang.reflect.Method.invoke(Method.java:606)
Error:Android Dex: [EdiLife] at org.jetbrains.android.compiler.tools.AndroidDxRunner.runDex(AndroidDxRunner.java:161)
Error:Android Dex: [EdiLife] at org.jetbrains.android.compiler.tools.AndroidDxRunner.main(AndroidDxRunner.java:294)
Error:Android Dex: [EdiLife] at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:121)
在Android Studio環境下Compiler 專案,結果跳出這惱人的錯誤,
後來查一查,"Multiple dex files define Lcom/google/android/gcm/GCMBaseIntentService"
發現是匯入到相同的兩個lib,因此package name有衝突,將一個移除後就可以正常Compiler了。
Error:Android Dex: [EdiLife] com.android.dex.DexException: Multiple dex files define Lcom/google/android/gcm/GCMBaseIntentService;
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
Error:Android Dex: [EdiLife] at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
Error:Android Dex: [EdiLife] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
Error:Android Dex: [EdiLife] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
Error:Android Dex: [EdiLife] at com.android.dx.command.dexer.Main.run(Main.java:230)
Error:Android Dex: [EdiLife] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error:Android Dex: [EdiLife] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Error:Android Dex: [EdiLife] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Error:Android Dex: [EdiLife] at java.lang.reflect.Method.invoke(Method.java:606)
Error:Android Dex: [EdiLife] at org.jetbrains.android.compiler.tools.AndroidDxRunner.runDex(AndroidDxRunner.java:161)
Error:Android Dex: [EdiLife] at org.jetbrains.android.compiler.tools.AndroidDxRunner.main(AndroidDxRunner.java:294)
Error:Android Dex: [EdiLife] at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:121)
在Android Studio環境下Compiler 專案,結果跳出這惱人的錯誤,
後來查一查,"Multiple dex files define Lcom/google/android/gcm/GCMBaseIntentService"
發現是匯入到相同的兩個lib,因此package name有衝突,將一個移除後就可以正常Compiler了。
6.10.2015
Android Studio build error - JDK CreateProcess error=2, 系統找不到指定的檔案。
Cannot run program "C:\Program Files\Java\jdk1.8.0_25/bin/java": CreateProcess error=2, 系統找不到指定的檔案。
發生這錯誤,原因是我把jdk1.8砍掉了,換成jdk1.7(至於為什麼要降版,因為要做ProGuard混淆程式碼必須在jdk1.7以下版本才有支援)。
很奇怪的是系統的環境變數(PATH)我也改了也重開機了,Android Studio就是不會自動抓取參數值,所以我找了又找看是哪邊寫死了參數。
後來發現在"User/(使用者名稱)/.AndroidStudioBeta/config/options/jdk.table.xml"裡面寫死了很多jdk1.8.0_25值,ORZ...把他全改成1.7的路徑後,就都正常了。
發生這錯誤,原因是我把jdk1.8砍掉了,換成jdk1.7(至於為什麼要降版,因為要做ProGuard混淆程式碼必須在jdk1.7以下版本才有支援)。
很奇怪的是系統的環境變數(PATH)我也改了也重開機了,Android Studio就是不會自動抓取參數值,所以我找了又找看是哪邊寫死了參數。
後來發現在"User/(使用者名稱)/.AndroidStudioBeta/config/options/jdk.table.xml"裡面寫死了很多jdk1.8.0_25值,ORZ...把他全改成1.7的路徑後,就都正常了。
5.05.2015
Android : ViewPager , 循環滑屏
使用ViewPager的layout,可左右一直滑動無限制的循環,畫面呈現如下
Layout的主要元件為"android.support.v4.view.ViewPager",可在SDK包裡面找到這份jar,路徑:"android-sdks\extras\android\support\v4\android-support-v4.jar",將此import進專案裡。
xml代碼:
<Linearlayout xmlns:android="http://schemas.android.com/apk/res/android">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Horizontalscrollview
android:scrollbarSize="0dp"
android:scrollbars="none"
android:id="@+id/tab_view"
android:layout_width="match_parent"
android:layout_height="70dp">
<Linearlayout
android:id="@+id/my_tab"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="Home"
android:textColor="@android:color/black"
android:id="@+id/home"
android:gravity="center"
android:background="@null"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<Button
android:text="Page1"
android:textColor="@android:color/black"
android:id="@+id/page1"
android:background="@null"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<Button
android:text="Page2"
android:textColor="@android:color/black"
android:id="@+id/page2"
android:background="@null"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<Linearlayout
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="5dp">
<Imageview
android:id="@+id/tab_bottom_line"
android:background="#22a4d4"
android:layout_width="50dp"
android:layout_height="5dp"/>
<android.support.v4.view.viewpager
android:id="@+id/my_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
畫面主要分上下兩部分,上面為tag,下半部為每個tag的內容。
程式代碼:
class MyPagerAdapter extends PagerAdapter{
private Context c;
public MyPagerAdapter(Context context) {
this.c = context;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View v = mPagerViews.get(position);
if(v.getParent() != null){
ViewGroup vg = (ViewGroup)v.getParent();
vg.removeView(v);
}
container.addView(v, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
return v;
}
@Override
public int getCount() {
return mPagerViews.size();
}
@Override
public boolean isViewFromObject(View v, Object o) {
return v == o;
}
}
private int mX;
private void test2() {
setContentView(R.layout.activity_main2);
mTabLine = (ImageView)findViewById(R.id.tab_bottom_line);
ViewGroup.LayoutParams _layoutP = mTabLine.getLayoutParams();
_layoutP.width = mWidth/TabOnePageSize;
mTabLine.setLayoutParams(_layoutP);
LinearLayout _my_tab = (LinearLayout)findViewById(R.id.my_tab);
_my_tab.removeAllViews();
for(int index = 0; index < PageNumber; index++){
TextView _layout = new TextView(this);
_layout.setTextSize(100);
_layout.setTextColor(Color.GRAY);
String _page;
int _color;
if(index == 0){
_page = "Page "+(PageNumber-2);
_color = -21704*(PageNumber-2);
}
else if(index == PageNumber-1){
_page = "Page "+1;
_color = -21704;
}
else{
_page = "Page "+index;
_color = -21704*(index);
Button _b = new Button(this);
if(index == 1) _b.setTextColor(Color.parseColor(mTabColor));
else _b.setTextColor(Color.BLACK);
_b.setBackgroundColor(Color.WHITE);
_b.setText(_page);
_my_tab.addView(_b,mWidth / TabOnePageSize, ViewGroup.LayoutParams.MATCH_PARENT);
mTabViews.add(_b);
final int _index = index;
_b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View view) {
currentTabIndex = _index;
mViewPager.setCurrentItem(currentTabIndex,true);
}
});
}
_layout.setText(_page);
_layout.setBackgroundColor(_color);
mPagerViews.add(_layout);
}
mPagerAdapter = new MyPagerAdapter(this);
mViewPager = (ViewPager)findViewById(R.id.my_viewpager);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOffscreenPageLimit(PageNumber);
mViewPager.setCurrentItem(1);
mViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN)
{
mX = (int) motionEvent.getX();
}
else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE)
{
final int _move = (int) (mX - motionEvent.getX())/3;
TranslateAnimation _tranA = new TranslateAnimation(0,_move,0,0);
_tranA.setDuration(0);
_tranA.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mTabLine.clearAnimation();
mTabLine.layout(mTabLine.getLeft()+_move,mTabLine.getTop(),mTabLine.getRight()+_move,mTabLine.getBottom());
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mTabLine.startAnimation(_tranA);
mX = (int) motionEvent.getX();
}
else if(motionEvent.getAction() == MotionEvent.ACTION_UP)
{
scrollTabView();
}
return false;
}
});
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int pos) {
currentTabIndex = pos;
boolean _move_again = false;
if(currentTabIndex == PageNumber -1)
{
currentTabIndex = 1;
mViewPager.setCurrentItem(currentTabIndex,false);
_move_again = true;
}
else if(currentTabIndex == 0)
{
currentTabIndex = PageNumber-2;
mViewPager.setCurrentItem(currentTabIndex,false);
_move_again = true;
}
for(int count = 0; count< mTabViews.size(); count++)
{
int _now = currentTabIndex-1;
if(count == _now) ((Button)mTabViews.get(count)).setTextColor(Color.parseColor(mTabColor));
else ((Button)mTabViews.get(count)).setTextColor(Color.BLACK);
}
if(!_move_again) scrollTabView();
preTabIndex = currentTabIndex;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
private void scrollTabView() {
HorizontalScrollView _tab_view = (HorizontalScrollView)findViewById(R.id.tab_view);
int _move = mWidth*((currentTabIndex-1)/TabOnePageSize);
_tab_view.smoothScrollTo(_move, 0);
int page = currentTabIndex-1;
if(_move == ((PageNumber-2)/TabOnePageSize*mWidth)) page+=(PageNumber%3);
final int _XPosition = (page)%3*(mWidth/TabOnePageSize);
int _Xmove = _XPosition - mTabLine.getLeft();
TranslateAnimation _tranA = new TranslateAnimation(0,_Xmove,0,0);
_tranA.setDuration(0);
_tranA.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mTabLine.clearAnimation();
mTabLine.layout(_XPosition,mTabLine.getTop(),_XPosition+mTabLine.getWidth(),mTabLine.getBottom());
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mTabLine.startAnimation(_tranA);
}
初始化ViewPager時在頭/尾各多加最後一頁/第一頁,讓使用者可以在第一頁時再往左滑到最後一頁;反之如此。除此外只要偵測touch event發生後page切換到哪一頁,再scroll tag bar就能達到tag與page搭配的循環換頁效果。
4.10.2014
Android : WebView 自適螢幕大小
讓WebView裡面的內容自動調成螢幕大小有以下兩種方法 :
WebView.getSettings().setLoadWithOverviewMode(true);
setUseWideViewPort() : 參數可設定true或是false,設定true時會將viewport的meta tag啟動,而meta tag又是甚麼呢?在W3C協議裡"This section is not normative.",並沒有強制規範,不過Android的API說明有提到"When the value is true and the page contains the viewport meta tag, the value of the width specified in the tag is used. If the page does not contain the tag or does not provide a width, then a wide viewport will be used." 如果我們沒有強制設定寬度,那麼就會使用可是範圍的最大視野,其意思就是螢幕的大小。
setLoadWithOverviewMode() : 參數值可設定true或是false,默認值是false,此參數值設定為true是為了當內容大於viewport時,系統將會自動縮小內容以適屏幕寬度.
有些部落客有寫到這種方法,但官方表示"This algorithm is now obsolete."此種方法已過時了,也許在某些版本可以正常使用,但就我最近在最新的4.4.2版本上跑,它並沒有自是螢幕大小,因此我會排除此方法,所以在這我就不多贅述了.
第一種方法,啟動viewport的meta標籤:
WebView.getSettings().setUseWideViewPort(true);WebView.getSettings().setLoadWithOverviewMode(true);
setUseWideViewPort() : 參數可設定true或是false,設定true時會將viewport的meta tag啟動,而meta tag又是甚麼呢?在W3C協議裡"This section is not normative.",並沒有強制規範,不過Android的API說明有提到"When the value is true and the page contains the viewport meta tag, the value of the width specified in the tag is used. If the page does not contain the tag or does not provide a width, then a wide viewport will be used." 如果我們沒有強制設定寬度,那麼就會使用可是範圍的最大視野,其意思就是螢幕的大小。
setLoadWithOverviewMode() : 參數值可設定true或是false,默認值是false,此參數值設定為true是為了當內容大於viewport時,系統將會自動縮小內容以適屏幕寬度.
第二種方法:
WebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);有些部落客有寫到這種方法,但官方表示"This algorithm is now obsolete."此種方法已過時了,也許在某些版本可以正常使用,但就我最近在最新的4.4.2版本上跑,它並沒有自是螢幕大小,因此我會排除此方法,所以在這我就不多贅述了.
2.20.2013
PPT slideshow on Android
前陣子在研究如何在Android平台上寫一個播放PPT檔案的APK。
找了很久只找到POI Library(http://poi.apache.org/),這是一切噩夢的開始。
備註 : 我的作法是把每一張幻燈片轉成一張jpg檔,然後在淡入淡出播放,目前也還沒看到可以播放幻燈片動畫的apk。p.s.如果有的話請與分享,感謝
POI Library中有用到純java裡的awt package (http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/package-summary.html) 這個包正巧android沒有收入(我想它不收入也是正確的,它有自己一套的作圖法),為了解決這頭痛的原因,在網路上翻來覆去的找,總算讓我找到替代的方案,不是我在說網友們真的很厲害,就是這LGame (http://blog.csdn.net/cping1982/article/details/6069738) 解決了我大半的困擾,當然自己也可以去實現所需要的interface,但既然有現成的為何不用呢!
找了很久只找到POI Library(http://poi.apache.org/),這是一切噩夢的開始。
備註 : 我的作法是把每一張幻燈片轉成一張jpg檔,然後在淡入淡出播放,目前也還沒看到可以播放幻燈片動畫的apk。p.s.如果有的話請與分享,感謝
POI Library中有用到純java裡的awt package (http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/package-summary.html) 這個包正巧android沒有收入(我想它不收入也是正確的,它有自己一套的作圖法),為了解決這頭痛的原因,在網路上翻來覆去的找,總算讓我找到替代的方案,不是我在說網友們真的很厲害,就是這LGame (http://blog.csdn.net/cping1982/article/details/6069738) 解決了我大半的困擾,當然自己也可以去實現所需要的interface,但既然有現成的為何不用呢!
7.12.2012
Android Api : How to get the system environment variables
System.getenv(String name) : Returns the value of the environment variable with the given name .
Parameter : name -> the name of the environment variable.
How to know all of the environment variables:
Enter adb shell command line . Then key in "export" and you will get all of the environment variables.
By the way, if you want to add a environment variable,you just key in "exprot variable-name="variable-value" ".
5.03.2011
Linux: make APK (隨手札記)
為什麼APK需要特地在Linux底下make,而不使用像eclipse這麼好用的編譯軟體呢?原因就在,APK需要特別簽章的時候,如果APK不在linux下make是無法Install至系統的,至於特別簽章是甚麼意思呢?需要用到系統權限的AP,例如Reboot功能必須在Androidmanifest.xml下添加,uses-permission android:name="android.intent.action.REBOOT"這行得到了reboot的功能後,更重要的是必須要得到系統的權限,於是再添加"android:sharedUserId="android.uid.system",這行就是使用系統權限的關鍵<--詳細請點我-->
接下來將寫好的Android專案整個資料夾放在Linux底下的Android開發包\packages\apps\,此時資料夾裡的文件結構應該是:
4.28.2011
Android APP概述(隨手札記)
Android 應用程式以java語言為主,副檔名為.apk,構成android應用程是主要有4大元件:
1.Activity(活動)
此為Android最基本的應用元件,一個活動通常是一個單獨的使用者介面,存在一個或多個UI(又稱view)控制項
One Activity(1) starts~ onCreate →onStart →onResume
當Activity(1)被創建時會調用onCreate在這裡通常做些初始化的動作,當初始化完後會進入onStart,將畫面秀在螢幕上,接著進入onResume,鎖定activity畫面(取得畫面控制權),接著Activity(1)就能被使用者操作。
1.Activity(活動)
此為Android最基本的應用元件,一個活動通常是一個單獨的使用者介面,存在一個或多個UI(又稱view)控制項
- Activity生命週期如下:
當Activity(1)被創建時會調用onCreate在這裡通常做些初始化的動作,當初始化完後會進入onStart,將畫面秀在螢幕上,接著進入onResume,鎖定activity畫面(取得畫面控制權),接著Activity(1)就能被使用者操作。
4.18.2011
U-boot 編譯錯誤
出現下面錯誤訊息:
board.c:126: error: inline function 'coloured_LED_init' cannot be declared weak
board.c:128: error: inline function 'red_LED_on' cannot be declared weak
board.c:130: error: inline function 'red_LED_off' cannot be declared weak
board.c:132: error: inline function 'green_LED_on' cannot be declared weak
board.c:134: error: inline function 'green_LED_off' cannot be declared weak
board.c:136: error: inline function 'yellow_LED_on' cannot be declared weak
board.c:138: error: inline function 'yellow_LED_off' cannot be declared weak
[board.o]ERROR
後來GOOGLE了一下,有人提到是gcc版本太高的緣故
我查了一下我的gcc -v,是gcc-4.4.3的版本,想起來之前有更新過
於是下"sudo apt-get remove gcc-4.4.3"將gcc-4.4.3 remove掉,在下sudo apt-get install gcc-4.3的指令去下載4.3版的gcc,問題就解決了
board.c:126: error: inline function 'coloured_LED_init' cannot be declared weak
board.c:128: error: inline function 'red_LED_on' cannot be declared weak
board.c:130: error: inline function 'red_LED_off' cannot be declared weak
board.c:132: error: inline function 'green_LED_on' cannot be declared weak
board.c:134: error: inline function 'green_LED_off' cannot be declared weak
board.c:136: error: inline function 'yellow_LED_on' cannot be declared weak
board.c:138: error: inline function 'yellow_LED_off' cannot be declared weak
[board.o]ERROR
後來GOOGLE了一下,有人提到是gcc版本太高的緣故
我查了一下我的gcc -v,是gcc-4.4.3的版本,想起來之前有更新過
於是下"sudo apt-get remove gcc-4.4.3"將gcc-4.4.3 remove掉,在下sudo apt-get install gcc-4.3的指令去下載4.3版的gcc,問題就解決了
4.17.2011
Linux: Unable to look up git.kernel.org 錯誤
下git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.35.y.git kernel_imx這指令結果ubuntbu一直報錯,出現Unable to look up git.kernel.org........的錯誤訊息,首先我就先去檢查網路是否有通,結果是可以上網的。但是只要上android.git.kernel.org、git.kernel.org皆會報找不到server的訊息,後來去網路上查資料,發現可能是因為公司的無線網路把git給檔下來,以致無法連上git...server,後來用ip分享器連接公司的有線網路,在將/etc/resolv.conf這文件內容改成:
nameserver 192.168.0.1
domain ol
search ol
,改完後check "sudo vim /etc/network/interfaces"裡面的內容
auto lo
iface lo inet loopback <<自動取得IP位址
並下"sudo /etc/init.d/networking restart"命令去restart network,問題就解決了。不過我想IP分享器只是多餘的一個步驟,直接用有線網路就可以解決了。
nameserver 192.168.0.1
domain ol
search ol
,改完後check "sudo vim /etc/network/interfaces"裡面的內容
auto lo
iface lo inet loopback <<自動取得IP位址
並下"sudo /etc/init.d/networking restart"命令去restart network,問題就解決了。不過我想IP分享器只是多餘的一個步驟,直接用有線網路就可以解決了。
SD card on Android
這禮拜上了SDcard on Android的課,發現單單SDcard的mount
unmoun format功能背後的架構卻那麼複雜。上這門課的是因為當初有個
特殊的要求,必須要在android的機子上安裝兩個SDcard插槽,一張boot
一張user,想用android.os.Environment.getExternalStorageState()
取得SDcard的狀態,可是卻永遠取得/mmt/sdcard/(boot)這張SDcard
的State,這件事困擾了很久。後來用了broadcastreceiver去接收
Intent.ACTION_MEDIA_UNMOUNTED、Intent.ACTION_MEDIA_MOUNTED訊息,暫時解
決的問題,但是這並不是一個好的解決方法,後來歪腦筋就動到了Framework
那層,後來發現了MountService總是會送出
"When the second sd card acts, the state doesn't change!"這樣的訊息。
去看了source發現他裡面複雜的很,追到PackageManagerService的updata
後我就舉雙手投降了。廢話了那麼久,下面我終於要進入到重點了......
unmoun format功能背後的架構卻那麼複雜。上這門課的是因為當初有個
特殊的要求,必須要在android的機子上安裝兩個SDcard插槽,一張boot
一張user,想用android.os.Environment.getExternalStorageState()
取得SDcard的狀態,可是卻永遠取得/mmt/sdcard/(boot)這張SDcard
的State,這件事困擾了很久。後來用了broadcastreceiver去接收
Intent.ACTION_MEDIA_UNMOUNTED、Intent.ACTION_MEDIA_MOUNTED訊息,暫時解
決的問題,但是這並不是一個好的解決方法,後來歪腦筋就動到了Framework
那層,後來發現了MountService總是會送出
"When the second sd card acts, the state doesn't change!"這樣的訊息。
去看了source發現他裡面複雜的很,追到PackageManagerService的updata
後我就舉雙手投降了。廢話了那麼久,下面我終於要進入到重點了......
4.14.2011
tar解壓指令 of Linux (轉)
再詳細不過了......文章來源
------------------------------------------------
tar [-cxtzjvfpPN] 文件與目錄 ....
參數:
-c :建立一個壓縮文件的參數指令(create 的意思);
-x :解開一個壓縮文件的參數指令!
-t :查看 tarfile 裡面的文件!
特別注意,在參數的下達中, c/x/t 僅能存在一個!不可同時存在!
因為不可能同時壓縮與解壓縮。
-z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
-j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
-v :壓縮的過程中顯示文件!這個常用,但不建議用在背景執行過程!
-f :使用檔名,請留意,在 f 之後要立即接檔名喔!不要再加參數!
例如使用『 tar -zcvfP tfile sfile'就是錯誤的寫法,要寫成
『 tar -zcvPf tfile sfile'才對喔!
-p :使用原文件的原來屬性(屬性不會依據使用者而變)
-P :可以使用絕對路徑來壓縮!
-N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的文件中!
--exclude FILE:在壓縮的過程中,不要將 FILE 打包!
範例:
範例一:將整個 /etc 目錄下的文件全部打包成為 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==僅打包,不壓縮!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包後,以 gzip 壓縮
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包後,以 bzip2 壓縮
# 特別注意,在參數 f 之後的文件檔名是自己取的,我們習慣上都用 .tar 來作為辨識。
# 如果加 z 參數,則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file ~
# 如果加 j 參數,則以 .tar.bz2 來作為附檔名啊~
# 上述指令在執行的時候,會顯示一個警告訊息:
# 『tar: Removing leading `/' from member names'那是關於絕對路徑的特殊設定。
參數:
-c :建立一個壓縮文件的參數指令(create 的意思);
-x :解開一個壓縮文件的參數指令!
-t :查看 tarfile 裡面的文件!
特別注意,在參數的下達中, c/x/t 僅能存在一個!不可同時存在!
因為不可能同時壓縮與解壓縮。
-z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
-j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
-v :壓縮的過程中顯示文件!這個常用,但不建議用在背景執行過程!
-f :使用檔名,請留意,在 f 之後要立即接檔名喔!不要再加參數!
例如使用『 tar -zcvfP tfile sfile'就是錯誤的寫法,要寫成
『 tar -zcvPf tfile sfile'才對喔!
-p :使用原文件的原來屬性(屬性不會依據使用者而變)
-P :可以使用絕對路徑來壓縮!
-N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的文件中!
--exclude FILE:在壓縮的過程中,不要將 FILE 打包!
範例:
範例一:將整個 /etc 目錄下的文件全部打包成為 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==僅打包,不壓縮!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包後,以 gzip 壓縮
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包後,以 bzip2 壓縮
# 特別注意,在參數 f 之後的文件檔名是自己取的,我們習慣上都用 .tar 來作為辨識。
# 如果加 z 參數,則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file ~
# 如果加 j 參數,則以 .tar.bz2 來作為附檔名啊~
# 上述指令在執行的時候,會顯示一個警告訊息:
# 『tar: Removing leading `/' from member names'那是關於絕對路徑的特殊設定。
6.24.2009
4.08.2009
3.27.2009
NET3.5 於PDA版本
前一陣子 誤打誤撞把同組員給我的NET3.5灌進了PDA
之前在MSDN下載的NET3.5 版本不適用於PDA裝置
怎麼跑就是會有錯誤 但灌了同組員給的"對的"版本後
我總算問題是解決了
所以我在這裡說明一下 正確的版本名稱叫"NETCFv35.Messages.zh-CHS.wm"or"NETCFv35.Messages.zh-CHT.wm"
如果需要可以跟我索取ˊˇˋ
之前在MSDN下載的NET3.5 版本不適用於PDA裝置
怎麼跑就是會有錯誤 但灌了同組員給的"對的"版本後
我總算問題是解決了
所以我在這裡說明一下 正確的版本名稱叫"NETCFv35.Messages.zh-CHS.wm"or"NETCFv35.Messages.zh-CHT.wm"
如果需要可以跟我索取ˊˇˋ
2.09.2009
聲音播放整合於masp
與C#一番惡鬥後~終於讓我把播放功能~整合到masp了。可能原本程式就有些莫名奇妙的警告
所以在加入新元件時財會困難重重,有時解決了當下的困難,下一秒卻又有新的問題產生,
很特別的是,因為參考組件不會自動更新,必須要手動砍掉在加入,還有一些路逕的問題,
都非常的惱人,才發覺用C#~好像程式並不是最大的困難壓~接下來的作業就是要加入對講機
的功能,先找資料去啦!
選取檔案的程式碼
OpenFileDialog pURL = new OpenFileDialog();
pURL.Filter = "All files (*.*)|*.*";
///應該看得懂八~不做解釋了
所以在加入新元件時財會困難重重,有時解決了當下的困難,下一秒卻又有新的問題產生,
很特別的是,因為參考組件不會自動更新,必須要手動砍掉在加入,還有一些路逕的問題,
都非常的惱人,才發覺用C#~好像程式並不是最大的困難壓~接下來的作業就是要加入對講機
的功能,先找資料去啦!
選取檔案的程式碼
OpenFileDialog pURL = new OpenFileDialog();
pURL.Filter = "All files (*.*)|*.*";
///應該看得懂八~不做解釋了
12.08.2008
NET.3.5&NET.2.0
**在做下列這些動作時 必須先做的動作是轉換精靈完成後 要RUN一次
確保設計界面的元件程式都還認識
在sounplayer使用上必須於表頭打using System Media 但在NET2.0裡不支援這組件參考
在舊的專案中使用的是NET2.0的參考組件 所以必須將參考組件中System.dll這參考組件砍
掉再加入參考→瀏覽→C:\Program Files\Microsoft NET→SDK→CompactFramework→V3.5→WindowsCE→System.dll
另外還有要特別注意的是 之前在2005版做的介面設計裡面的mscorlib.dll的參考組件也與2008版的
有所不同 所以也要砍掉重加 至於版本更久遠的 就要自己試試拉!如果不行就都砍掉重加八
確保設計界面的元件程式都還認識
在sounplayer使用上必須於表頭打using System Media 但在NET2.0裡不支援這組件參考
在舊的專案中使用的是NET2.0的參考組件 所以必須將參考組件中System.dll這參考組件砍
掉再加入參考→瀏覽→C:\Program Files\Microsoft NET→SDK→CompactFramework→V3.5→WindowsCE→System.dll
另外還有要特別注意的是 之前在2005版做的介面設計裡面的mscorlib.dll的參考組件也與2008版的
有所不同 所以也要砍掉重加 至於版本更久遠的 就要自己試試拉!如果不行就都砍掉重加八
sounplayer
主要程式碼有三行
最簡單的寫法:
using System Media;
/*表頭宣告*/
System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer();
/*要使用System.Media.SoundPlayer的功能 必須先設自訂myPlayer將System.Media.SoundPlayer丟給myPlayer*/
myPlayer.SoundLocation = file_path;
/*file_path為myPlayer的聲音播放位子(SoundLocation) file_path可為/@檔名(同資料夾下的檔案)*/
myPlayer.Play();
/*聲音播放*/
目前這函數只支援WAV檔
最簡單的寫法:
using System Media;
/*表頭宣告*/
System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer();
/*要使用System.Media.SoundPlayer的功能 必須先設自訂myPlayer將System.Media.SoundPlayer丟給myPlayer*/
myPlayer.SoundLocation = file_path;
/*file_path為myPlayer的聲音播放位子(SoundLocation) file_path可為/@檔名(同資料夾下的檔案)*/
myPlayer.Play();
/*聲音播放*/
目前這函數只支援WAV檔
訂閱:
文章 (Atom)




