2014年7月14日 星期一
2014年7月9日 星期三
Android 開發 (五十六) Gradle 如何增加lib
Gradle 跟eclipse的行為很不一樣,在eclipse中當我們缺少lib,需要將lib檔加入 libs folder或者加入 android lib中
但是在 android studio中一切都變了,如今...要import library變得更簡單,我們不再需要繁瑣的import 沒用的project,也不需要每次為了幫別人架設環境用半天了
在 Android Studio 中我們可以利用 file -> Project Structure -> Dependencies 增加我們需要的lib
在 Android Studio 中我們可以利用 file -> Project Structure -> Dependencies 增加我們需要的lib
假設我們需要import external的lib,變得更簡單了,以前我們可能必須import一大堆的project到我們的專案中,現在這一切已經不再必要,你只需要知道版本號之後只需要在上面的search欄中填入你的lib 並且點選ok就完成了,舉個簡單的例子,例如我的project想要import eventbus這個功能
我只需要將
dependencies {
compile 'de.greenrobot:eventbus:2.2.1'
}
加入我的dependencies中即可,剩下的gradle會幫你解決所有的問題。
真的是超級方便啊,不過最近在0.81 版本上遇到一個問題,
感覺是0.8的bug,看起來是因為gradle設定檔內使用
compile 'com.android.support:support-v4:+' 造成 gradle去使用最新版本的 support-v4 然而最新版本的 support-v4似乎只支援 L, 所以必須將上面的 dependencies 改成 compile 'com.android.support:support-v4:20.0.0' 這樣就解決了。
Android studio真的很方便,而且也進入beta了,如果是寫新app的人可以直接切過來了,至於必須維護舊app的人,這條路也是必經之路,現在這個時間點也是可以考慮切換的時候了,畢竟eclipse真的很麻煩啊XD。
Android 開發 (五十五) GoogleCloudMessaging
最近在玩Gradle的時候意外發現
GCMRegistrar Is Deprecated
我記得在我剛接觸android時...GCM才剛改版過...如今過了不到一年...他又改版了...
雖然說又改版了,不過使用方式並沒有太大的改變。只是新版的register不能在MAIN_THREAD中執行,必須使用async task去做...
附上簡單的執行片段
雖然說又改版了,不過使用方式並沒有太大的改變。只是新版的register不能在MAIN_THREAD中執行,必須使用async task去做...
附上簡單的執行片段
new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { String msg; try{ GoogleCloudMessaging gcm; gcm = GoogleCloudMessaging.getInstance(getApplicationContext()); String regid = gcm.register(SENDER_ID); Log.d("Ted","id "+regid); msg = "Device registered, registration ID=" + regid; } catch (IOException ex) { msg = "Error :" + ex.getMessage(); // If there is an error, don't just keep trying to register. // Require the user to click a button again, or perform // exponential back-off. } return msg; } @Override protected void onPostExecute(String msg) { } }.execute(null, null, null);
regid 就是server訊息傳送時所需的token,根據sample code的寫法,只有在第一次執行的時候才會執行register 其他時候都是由sharepreference取得之前的regid (這代表著regid不變?這點我很懷疑)。
其他的使用方式跟以前沒太大的差別,有興趣可以參考 Hello GCM
最後附上 sample code
Android 開發 (五十四) 客製化 progress bar
通常內建的progressbar都長的不是非常的好看,假設我們今天想要客製化一個自己的progress bar,
我們可以利用drawable + Animatable 來完成我們想要的客製化progress bar , 主要轉動的部分當然是由animation來完成的,我們只需要利用drawArc,並且使用animation來更改餵進去的參數即可,
至於改變參數的方法可以參考下面的code
這是4.0之後的寫法,在property改變的時候去設定值,並且call invalidateSelf()使得draw被重複trigger
最後附上 sample code
我們可以利用drawable + Animatable 來完成我們想要的客製化progress bar , 主要轉動的部分當然是由animation來完成的,我們只需要利用drawArc,並且使用animation來更改餵進去的參數即可,
@Override public void draw(Canvas canvas) { canvas.drawArc(mBounds, mCurrentAngle, 340, false, mPaint); }不斷的call draw並且更改mCurrentAngle造成progressbar轉動的效果
至於改變參數的方法可以參考下面的code
mObjectAnimatorAngle = ObjectAnimator.ofFloat(this, mAngleProperty, 360f); mObjectAnimatorAngle.setInterpolator(new LinearInterpolator()); mObjectAnimatorAngle.setDuration(ANGLE_ANIMATOR_DURATION); mObjectAnimatorAngle.setRepeatMode(ValueAnimator.RESTART); mObjectAnimatorAngle.setRepeatCount(ValueAnimator.INFINITE);
這是4.0之後的寫法,在property改變的時候去設定值,並且call invalidateSelf()使得draw被重複trigger
private Property<MyProgressDrawable, Float> mAngleProperty = new Property<MyProgressDrawable, Float>(Float.class, "angle") { @Override public Float get(MyProgressDrawable object) { return object.getCurrentAngle(); } @Override public void set(MyProgressDrawable object, Float value) { object.setCurrentAngle(value); } }; public void setCurrentAngle(Float angle) { mCurrentAngle = angle; invalidateSelf(); }
最後附上 sample code
2014年7月2日 星期三
Android 開發 (五十二) facebook login + Nest Fragment
當使用facebook login,出現偶發無法login 並且查詢status為 opening的時候,就必須注意是否已經踏入了facebook api的坑中。
當我們在Nest Fragment的時候(ex :TabHost+ Viewpager),onActivityResult可能會沒有被呼叫到,
這就會造成login失敗,最好的方法就是不要在Nest Fragment裡做 facebook login,否則就必須想辦法在ParentFragment (通常為TabHost的那個Fragment)中呼叫 子fragment 的onActivityResult
不過這個方法也不能100%的避掉問題,有時候 ParentFragment的 onActivityResult也不會被呼叫到。
所以回到最原始的解法,當必須在Nest Fragment中呼叫login時,還是偷偷開一個fragment或Activity做login的動作吧..
facebook login api 必須在每個state 中做事情例如
public void onStart() { Session.getActiveSession().addCallback(this); } public void onStop() { Session.getActiveSession().removeCallback(this); } public void onActivityResult(int requestCode, int resultCode, Intent data) { Session.getActiveSession().onActivityResult((Activity)context, requestCode, resultCode, data); }
當我們在Nest Fragment的時候(ex :TabHost+ Viewpager),onActivityResult可能會沒有被呼叫到,
這就會造成login失敗,最好的方法就是不要在Nest Fragment裡做 facebook login,否則就必須想辦法在ParentFragment (通常為TabHost的那個Fragment)中呼叫 子fragment 的onActivityResult
不過這個方法也不能100%的避掉問題,有時候 ParentFragment的 onActivityResult也不會被呼叫到。
所以回到最原始的解法,當必須在Nest Fragment中呼叫login時,還是偷偷開一個fragment或Activity做login的動作吧..
Android 開發 (五十一) facebook SDK 傳送 xmpp訊息 v1.0 facebook before 3.14
要使用facebook 傳送訊息是一個災難,因為能參考的資料非常少,facebook也只說明要使用xmpp來傳送訊息,所以在這邊提供一些Sample給大家參考。
首先先提供 相關檔案
https://drive.google.com/file/d/0B7nu3f_AuGWEM3l3WGJBQXp3R0E/edit?usp=sharing
裡面有三個檔案
這兩個檔案是跟xmpp相關的設定,不需要做修改,直接丟進workspace裡就行了
FacebookChatManager.java
SASLXFacebookPlatformMecha.java
第三個檔案
SendMessageIntentService.java
我這邊是使用background service來傳送 message 如果有仔細去看code會發現在傳送訊息之間我有使用sleep,這是因為我發現不間斷的傳送會讓訊息loss掉,所以使用這個方式(算是暫時可用的解法)
要使用這個功能,首先必須login 並且擁有"xmpp_login"的權限 如果已經login的話可以使用
newPermission來增加擁有的權限
只需要在newPermission裡面塞入 "xmpp_login"即可
接著稍微看一下 service裡面做的事情
我將message 以及 friend Id 傳進來在connect 完成之後就使用sendbatch的方式將訊息傳遞出去
facebook目前已經有提供新的做法,但是該做法必須安裝facebook messager 詳細的內容可以參考 http://tedforum.blogspot.tw/2014/05/android-facebook-v20314sdk-chat-api.html
首先先提供 相關檔案
https://drive.google.com/file/d/0B7nu3f_AuGWEM3l3WGJBQXp3R0E/edit?usp=sharing
裡面有三個檔案
這兩個檔案是跟xmpp相關的設定,不需要做修改,直接丟進workspace裡就行了
FacebookChatManager.java
SASLXFacebookPlatformMecha.java
第三個檔案
SendMessageIntentService.java
我這邊是使用background service來傳送 message 如果有仔細去看code會發現在傳送訊息之間我有使用sleep,這是因為我發現不間斷的傳送會讓訊息loss掉,所以使用這個方式(算是暫時可用的解法)
要使用這個功能,首先必須login 並且擁有"xmpp_login"的權限 如果已經login的話可以使用
newPermission來增加擁有的權限
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest( (Activity)context, newPermission); newPermissionsRequest.setCallback(statusCallback); Session.getActiveSession().requestNewPublishPermissions(newPermissionsRequest);
只需要在newPermission裡面塞入 "xmpp_login"即可
接著稍微看一下 service裡面做的事情
@Override protected void onHandleIntent(Intent intent) { // TODO Auto-generated method stub nameList = getNameList(intent); if(nameList.size()>0){ message = intent.getStringExtra(MSG_EXTRA); FacebookChatManager facebookChatManager = FacebookChatManager.getInstance(this); if (facebookChatManager.connect()) { if (facebookChatManager.logIn(getString(R.string.fb_app_id), Session .getActiveSession().getAccessToken())) { List<String> resultList = facebookChatManager.findSendMessageList(nameList); facebookChatManager.sendBatchMessage(resultList, message); } facebookChatManager.disConnect(); } } }
我將message 以及 friend Id 傳進來在connect 完成之後就使用sendbatch的方式將訊息傳遞出去
facebook目前已經有提供新的做法,但是該做法必須安裝facebook messager 詳細的內容可以參考 http://tedforum.blogspot.tw/2014/05/android-facebook-v20314sdk-chat-api.html
訂閱:
文章 (Atom)