Category Archives: Android

Android Rate Button – 如何建立Android 評分按鈕

最近到了一個電腦活動
他們講解了鼓勵Apps使用者在你的App評分的重要性

所以使想到要為自己的程式更新..增加一個方便使用者Rate This App的功能
做了一會Research很發現..

解決方法十分簡單
我們可以建立一個功能.. 這可以方便將來重用…
之後使用 getPackageName 這個功能來取後這個程式的 Namespace
再建立一個 Google Play Store的網址連結
之後在用一個Intent來關啟便可以了
Google Play Store - L Quiz UK

E.G.

public void RateMyApp(){

  // 建立一個Intent - 在這個Intent 上使用 Google Play Store 的連結
  // E.G. market://details?id=
  // 之後用 getPackageName 這個功能來取後這個程式的 Namespace.
  Intent goToMarket = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getPackageName()));
 
  try {
        // 之後開始一個新的Activity 去這個Intent
        startActivity(goToMarket);
  } catch (ActivityNotFoundException e) {
        // 如果有錯誤的話 使用正常的網址來連接到 Google Play Store的網頁
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + getPackageName())));
  }
}

大家有沒有嘗試過找的 L Quiz UK App 呢?
https://play.google.com/store/apps/details?id=com.sharechiwai.lquizuk
L Quiz UK - About Page and Rate my App button

Hope you find it useful

Google Play Service Proguard Exception – 在ProGuard 上Google Play Service的設定 #ProguardException

相信很多寫Android App的朋友都有Proguardobfuscation 他們的程式碼

為了方便自己不用到Google 去搜尋 Google Play ServiceProguard Exception設定
所以便在這裡分享這個常用的 設定

-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

ProGuard Google Play Services Exception

詳情可以參考以下的網址
http://developer.android.com/google/play-services/setup.html

在這建立一個Tag 來記下所有Proguard的 Exception Rules
#ProguardException

Hope you find it useful

no resource identifier found for attribute ‘ adsize ‘ in package – Android Studio – Google Play Services

最近幾天都在嘗試學習如何在Android Studio上使用 Google Play Services AdMob
之前的Android App 是用Admob SDK的

之前出現了
UNEXECTED TOP-LEVEL EXCEPTION – com.android.dex.decExeption: Mulitiple dex file define的問題
UNEXECTED TOP-LEVEL EXCEPTION - com.android.dex.decExeption: Mulitiple dex file define
所以我便刪除了

compile 'com.google.android.gms:play-services:4.2.42'
compile files('libs/google-play-services.jar')

使用Android Studio 0.5.1 build.gradle上的

compile fileTree(dir: 'libs', include: ['*.jar'])

嘗試做了很久Research..試了很多方法..可惜都解決不到
no resource identifier found for attribute ‘ adUnitId ‘ in package android studio

最後嘗試以直角去解決這個問題…終於能幸運地解決 =)

解決方法
應該是更新了Android Studio 0.5.1 Gradle的處理放法不同的關係..
所以有小小混亂

解決這個問題
我們需要Comment out /或刪去build.gradle上的

compile fileTree(dir: 'libs', include: ['*.jar'])

之後再加上Google Play Services的 參考
我的方法是
Android Project上按Right Click -> 選擇”Open Module Settings
Android Studio - Open Module Settings
之後便會出現”Project Structure” Windows “Project Settings” -> “Module
在右手邊有一些選項..
選擇 “Dependencies
之後按”+” -> 選擇”Library Dependency
Project Structure - Module -> Library Dependency
Choose Library Dependency” windows 便會彈出來..
我們可以在這裡選擇 “Google Play Services
Android Studio - Choose Library Dependency
之後按”OK
他便會在build.gradle加入一些和Google Play Service相關的設定/參考
Android Studio - build.gradle
完成後再次Compile這個Project
之後便可以解決這個問題了
no resource identifier found for attribute ‘ adUnitId ‘ in package” 的錯誤便會消失了

Hope you find it useful

UNEXECTED TOP-LEVEL EXCEPTION – com.android.dex.decExeption: Mulitiple dex file define

在更新了Android Studio 0.5.1 後很多時候跟隨教學的東西都用不著..
今天我的學習過程中又出現了一些問題了
在嘗試使用Google Play Services 的時候出現了以下的錯誤..
UNEXECTED TOP-LEVEL EXCEPTION - com.android.dex.decExeption: Mulitiple dex file define
情況應該是這樣的..
Android Studio 0.5.1開始在 build.gradle上多了一句

compile fileTree(dir: 'libs', include: ['*.jar'])

當我學習使用Google Play Services時我是使用0.4.6 版本的..
所以便使用了之前 “How to Add Library to Android Studio – 怎樣在Android Studio上加入 Library
的”Add as Library“的方法 加入了 “Google Play Services
這個功能亦都在 build.gradle上加入了一些 Reference/設定

E.g.

compile 'com.google.android.gms:play-services:4.2.42'
compile files('libs/google-play-services.jar')

就是因為這樣..在Android Studio上好像把 google-play-services.jar參考/Compile了兩次..
第一次是

compile fileTree(dir: 'libs', include: ['*.jar'])

另一次是

compile files('libs/google-play-services.jar')

build.gradle has both references on dependencies
所以便出現了這個錯誤
UNEXECTED TOP-LEVEL EXCEPTION – com.android.dex.decExeption: Mulitiple dex file define

解決方法十分簡單
我們只是刪除其中一個參考便可以了..
我選擇刪除

compile 'com.google.android.gms:play-services:4.2.42'
compile files('libs/google-play-services.jar')

之後再次Compile. .便沒有錯誤了

build.gradle without the google play services reference

Hope you find it useful

How to Add Library to Android Studio – 怎樣在Android Studio上加入 Library

對於使用Android StudioAndroid / Java 的新手來說
怎樣在Android Studio上加入 Library 可能是一個經常出現的問題..

我在學習過程中看到有很多不同的方法..
很多時候他都都敎我們把Library 放到 “Libs”的資料夾上..
之後又要在Gradle 檔案內加入一些reference / 設定等的東西..
才可以使用

經過多天的研究後發現原來在
Android Studio 上加入Library是得容易的事來的…
只是把你想使用的Java Library
放在Android Studio Project 上的 “libs“資料夾內..
我的例子是”Google Play Services” Library “google-play-services.jar

在更新Android Studio5.1.0後發現

compile fileTree(dir: 'libs', include: ['*.jar'])

在”build.gradle“上 好像已經有設定..只要在”libs“上的”.jar“檔案都會被Compile
Android Studio build.gradle

這應該可以解決 Add Library時要自行在”build.gradle“上加入一些設定的問題

如果是使用較舊的Android Studio或者需要自行在這個.jar上按
Mouse右按鈕..選擇”Add as Library
Android Studio - Add as Library
Android Studio 便會在”build.gradle“上加入相關的設定..
你便可以開始使用這個Library

Hope you find it useful

Android Studio Update to 0.5.1 – Gradle 0.9.0 introduced incompatible changes in the build language issue

今天發現Android Studio 有更新… 可以更新到 0.5.1 (Build number: 134.1061098)
誰不知..更新完之後出現了問題…
Failed to refresh Gradle project
The project is using an unsupported version of the Android Gradle plug-in (0.8.3).

Version 0.9.0 introduced incompatible changes in the build language.
Failed to refresh Gradle project - Version 0.9.0 introduced incompatible changes in the build language.

之後叫我去下面的網頁看看怎樣解決這個升級的問題…
http://tools.android.com/tech-docs/new-build-system/migrating_to_09

看了一會..都不明白我的Project 要更新那些東西..
因為我的程式內Gradle 的設定和他那個網頁上的..大至相同…

當我按Make Project 的時候..他又出現以下的錯誤信息…
Failed to refresh Gradle project  - Version 0.9.0 introduced incompatible changes in the build language.

最後終於找到了解決方法了…

如果你看了Android Studio 給你的升級提示..
又覺得不識的話.. 可以嘗試以下的解決方法

解決方法十分簡單…
Android StudioProject 上 的最面層 Root Layer
有一個名叫”build.gradle“的gradle設定檔
開啟這個檔案之後你便會看到一些和這個Project上的設定
E.G. 有Build Script 等等
Dependencies上 的Classpath 找出一個以
com.android.tools.build.gradle:” 開頭的 句子 把他修改成 0.9.+便可以了

我的是這樣的

  dependencies {
        classpath 'com.android.tools.build:gradle:0.8.+'
    }

 classpath 'com.android.tools.build:gradle:0.8.+'

把他改成

  dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }

classpath 'com.android.tools.build:gradle:0.9.+'

儲存之後按一下上方的”Try Again“..令Android Studio再次Sync這個Gradle

之後應該可以解決這個問題的

Hope you find is useful

Proguard rule for Google Play Services / Admob

如果在Android 程式上有使用Google Play ServicesAdmob API的朋友…
當你使用Proguard的時候…
有可能會令到這兩個API的功能出現問題…

大家只要在你們的Proguard Config 檔案內加內以下的設定便可以了
E.G.
proguard.cfg

proguard-android.txt

Google Play Services

-keep public class com.google.android.gms.ads.** {public *;}

Admob API

-keep public class com.google.ads.** { public *;}

詳情可以參考以下網頁
https://developers.google.com/mobile-ads-sdk/kb/
Hope you find it useful