顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2014年12月25日 星期四

多國語言

在res目錄下建立不同名稱的values文件來使用不同的語言

Values文件匯總如下:
中文(中國):values-zh-rCN中文(台灣):values-zh-rTW
中文(香港):values-zh-rHK
英語(美國):values-en-rUS
英語(英國):values-en-rGB
英文(澳大利亞):values-en-rAU
英文(加拿大):values-en-rCA
英文(愛爾蘭):values-en-rIE
英文(印度):values-en-rIN
英文(新西蘭):values-en-rNZ
英文(新加坡):values-en-rSG
英文(南非):values-en-rZA
阿拉伯文(埃及):values-ar-rEG
阿拉伯文(以色列):values-ar-rIL
保加利亞文: values-bg-rBG
加泰羅尼亞文:values-ca-rES
捷克文:values-cs-rCZ
丹麥文:values-da-rDK
德文(奧地利):values-de-rAT
德文(瑞士):values-de-rCH
德文(德國):values-de-rDE
德文(列支敦士登):values-de-rLI
希臘文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美國):values-es-rUS
芬蘭文(芬蘭):values-fi-rFI
法文(比利時):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法國):values-fr-rFR
希伯來文:values-iw-rIL
印地文:values-hi-rIN
克羅里亞文:values-hr-rHR
匈牙利文:values-hu-rHU
印度尼西亞文:values-in-rID
意大利文(瑞士):values-it-rCH
意大利文(意大利):values-it-rIT
日文:values-ja-rJP
韓文:values-ko-rKR
立陶宛文:valueslt-rLT
拉脫維亞文:values-lv-rLV
挪威博克馬爾文:values-nb-rNO
荷蘭文(比利時):values-nl-BE
荷蘭文(荷蘭):values-nl-rNL
波蘭文:values-pl-rPL
葡萄牙文(巴西):values-pt-rBR
葡萄牙文(葡萄牙):values-pt-rPT
羅馬尼亞文:values-ro-rRO
俄文:values-ru-rRU
斯洛伐克文:values-sk-rSK
斯洛文尼亞文:values-sl-rSI
塞爾維亞文:values-sr-rRS
瑞典文:values-sv-rSE
泰文:values-th-rTH
塔加洛語:values-tl-rPH
土耳其文:values–r-rTR
烏克蘭文:values-uk-rUA
越南文:values-vi-rVN

2014年4月23日 星期三

[Android]conversion to dalvik format failed with error 1 解決

這幾天發生這個錯誤,紀錄一下,供日後參考

“Conversion to Dalvik format failed with error 1” on external JAR

Go to Project » Properties » Java Build Path » Libraries and remove all except the "Android X.Y" (in my case Android 1.5). click OK. Go to Project » Clean » Clean projects selected below » select your project and click OK. That should work.

It is also possible that you have a JAR file located somewhere in your project folders (I had copied the Admob JAR file into my src folder) and THEN added it as a Java Path Library. It does not show up under the Package Explorer, so you don't notice it, but it does get counted twice, causing the dreaded Dalvik error 1.

Another possible reason could be package name conflicts. Suppose you have a package com.abc.xyz and a class named A.java inside this package, and another library project (which is added to the dependency of this project) which contains the same com.abc.xyz.A.java, then you will be getting the exact same error. This means, you have multiple references to the same file A.java and can't properly build it.

In other ways this may be occurred if you accidentally or knowingly edit/ add any thing in the class path file manually .In certain cases we may add android.jar path manually to classpath file for generating java doc.On removing the that after javadoc generated code will works fine.Please check this too if any one still occurs.

share|improve this answer
edited Feb 25 at 11:00



另外參考:
https://www.google.com.tw/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCwQFjAA&url=http%3A%2F%2Fasd20277.pixnet.net%2Fblog%2Fpost%2F46603518-%255Bandroid%255Dconversion-to-dalvik-format-failed-with-error-1-%25E8%25A7%25A3&ei=gE5XU_uUGImKkgXK7oC4CA&usg=AFQjCNGxSQwIbp1IDU5A0GLeLL5vVjyP4w&sig2=iNjSVU9JqZoxbFPFcfinuA

大概有三種處理方法

1.

Project-->clean

2.
在目錄中搜索".classpath"檔案

再將檔案裡面的  

改為



3.

如果一次加入多個jar library時有可能會有這個問題

Project -> Properties -> Java Build Path -> Libraries

除了Andorid之外的.jar檔都移除掉,再按下OK

Project -> Clean -> Clean all project -> OK



還有


Conversion to Dalvik format failed with error 1解决方法:

第一种情况包导入错误.点击工程-->build path-->libraries-->选中android1.x 或者android2.x ,点击remove。
然后再点击add library-->User Library -->next-->User Libraries-->new 你取一个名字 比如android2.1 点击OK,
选中android2.1-->add jars-->\android-sdk-windows\platforms\android-7\android.jar 点击打开,点击ok-->finish.

第二种情况签名时没有成功。签名:java -jar signapk.jar platform.x509.pem platform.pk8 e:huaworkspace\hua\bin\hua.apk e:huaworkspace\hua\bin\hua_signaed.apk ,

如果hua_signaed.apk签名失败,那么请到你的工作目录中将hua_signaed.apk delete掉。

第三种情况包冲突,请到工程目录下将相同的包删除,重新导入一个,这一点和第一种情况类似,不过这是针对其他包,不是android包 
下面是eoeAndroid社区给大家找的一些其他解决方法,大家可以参考下:

conversion to dalvik format failed with error 1的解决办法(一)
http://www.eoeandroid.com/thread-177887-1-1.html

conversion to dalvik format failed with error 1的解决办法(二)http://www.eoeandroid.com/thread-177931-1-1.html



常见错误集锦
1

作者:风雪~泪发布于 02月21日访问(134评论(0

这些错误有些的我自己的,有的是我看其他人发表的就把他们整理在一起了,大家如果有什么错误都可以提供以下,嘿嘿...
1、出现“The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files"的错误。
问题原因:系统找不到JDK的位置,或者没有设置JDK的位置。
解决方法:
1.) 在Package Explorer->Project -> properties -> Java Bulid Path
2.) 选择"Add library..."
3.) 选择"JRE System Library"后,按Next.
4.) 选workplace default JRE后按finish...
备注:JRE system Library的存放路经一般存放在: android_sdksplatformsandroid-9android.jar , 第一个目录是你在安装JRE是选择的路经,不同的计算机可能会不同。
2、出现“The import android cannot be resolved”的错误。
问题原因:系统找不到Android SDK的路经
解决方法:
在Package Explorer -> project -> Properties -> Android中的Project Build Target里面勾选相应的SDK即可解决。
3、出现: Android requires compiler compliance level 5.0 or 6.0. Found '1.5' instead. Please fix project properties
问题原因:项目工程中的某些文件没有修改过来。
解决方法:
project ->android tools ->Fix Project
4、出现: conversion to dalvik format failed with error 1
在网上找到下面的解决方法:
android低版本工程(如1.5)放到高版本环境中(如2.2)可能会上述错误,解决方法如下:
(1). 如果不修改android sdk版本,则使用project clean 命令作用于某工程即可。
(该处理方式只是在高版本中兼容了低版本工程,未真正意义上的升级)
(2). 如果修改android sdk版本,则需要以下几个步骤:
1)修改SDK
选择工程,build path --> configure build path ---> library 删除引用的低版本SDK,
然后add External JARs,选择高版本SDK,OK,保存
2)修改classpath文件
该文件可能存在该项:
注意:classpath文件没有被加载到Eclipse的项目工程中去,它存放路经是在该项目的根目录里面的,你需要到硬盘上找到该文件用记事本打开后进行修改。
3) 修改AndroidManifest.xml
在AndroidManifest.xml文件中,application标签后添加
4) 修改default.properties(很重要)
该文件最后一行(前面没用#的)target=android-3 该成target=android-8,保存。
再看看你的工程和新建的android 2.2的工程结构就一样了。
但是在我这里问题还是没有解决,问题还是出在SDK的版本不符的问题上,我又使用了第二种方法,删除了无关的SDK库即可解决问题。
5、出现: Unhandled exception type IOException,如下所示:
原因:未经处理的IOException异常类型
解决方法是:回避或捕获这个异常就OK了。修改如下:
[java] view plaincopy
try{
txt.setText(getRawString().toString());
}
catch(Exception e){
e.printStackTrace();
}
6、Invalid project description
网上的解决方法是:在项目根目录下的.project文件中,找到cms6.0 将cms6.0改为和项目目录名称一致。
解决方法:我已经将该工程导入Eclipse,一个工程不能重复导入两次;或者把你的文件夹考的别的目录下然后重新导入即可。
原因:有两份相同的AndroidManifest.xml的描述性文件。
7、java.lang.SecurityException: Requires VIBRATE permission
解决方法:在AndroidManifest.xml中加上一句
“”
原因:权限问题导致,因为使用了震动功能。
8、Activity not started, its current task has been brought to the front
解决方法:在Eclipse中,“project”-->“clean…”
原因:模拟器中还有东西在运行,也就是你要运行的activity已经有一个在模拟器中运行了不要以为你的模拟器退出到桌面了就没有东西在跑了。在你调试的时候异常关闭的程序有可能就有activity在运行。
9、ArrayAdapter requires the resource ID to be a TextView
问题描述:java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView而
adapt = new ArrayAdapter (this, R.layout.main, infoList);
这句中布局main中的布局可能不是TextView对象。
adapt = new ArrayAdapter (A1, A2, A3);
参数A2是一个“resource ID to be a TextView
解决方法:A2改为:android.R.layout.simple_spinner_dropdown_item
10、R.java文件突然不见了
解决方法:右键项目-->Build Project
原因:res/drawable下的文件名只能是在a~z、0~9之间字符组成。
10、ScrollView can host only one direct child。
解决方法:需要把所有的子元素放到一个LinearLayout内部或RelativeLayout等其他布局方式。
原因:主要是ScrollView内部只能有一个子元素,即不能并列两个子元素。
11、emulator: ERROR: the user data image is used by another emulator. aborting
没有正常关闭导致的,删除android-sdk-windows.androidavd对于版本下的以.lock结尾的文件夹就行。
原因:.lock是加锁,如果程序崩溃等原因导致无法清除这些以.lock结尾的文件夹,就会出现这个问题,也就是这个avd的锁没有被释放,导致avd manager以为这个avd正在使用当中。
12、* daemon not running. starting it now *
ADB server didn't ACK
* failed to start daemon *
已经确认adb.exe的路径没有问题,重启了两次模拟器和eclipse还是不行,上网查了下资料~
解决办法:
(1)查看任务管理器,关闭所有adb.exe;(2)重启eclipse即可
13、android.content.res.resources notfoundexception
在Manifest.xml中加上:,或者将5改成6,其他值也一样加1
14、Unable to instantiate activity ComponentInfo
解决方案:更改activity android:name="Acitivity"为activity android:name=".Acitivity"
原因:AndroidManifest.xml配置activity的路径时出错了
15、工程名上有红色感叹号
解决方案:右键项目名称BuildPath--->ConfigureBuildPaht...中,然后上面有几个选项卡找到Libraries中出现红色叉号的包为路径错误的包。到classpath中修改相应包的当前路径。然后回到eclipse中F5刷新工程。
问题原因:工程中classpath中指向的包路径错误。
解释:用myeclipse新建web工程,在工程目录下会生成一个.classpath配置文件,里面是你工程里面引用的jar的配置。这个.classpath对你的web工程没有什么影响,其实是给myeclipse识别的。你说的这种情况是因为.classpath文件里面配置引用了某个jar,但是实际上你的lib里面并没有这个jar所以才会有红色的提示。你不用拿.classpath文件和你的jar一个个去找,你现在打开MyEclipse右键单击你的web工程,找到BuildPath-->ConfigureBuildPaht...-->然后上面有几个选项卡找到Libraries。这里看到的就是你工程里面引用的所有的jar,看看是不是在某个jar图标上有个很小的黄色的感叹号?如果有的话就没错了,先选中这个jar,点击右边的Remove-->点击OK等待几秒,现在web工程上面的红色XX是不是没有了,哈哈。解释一下:黄色的感叹号的jar,表示.classpath配置文件引用了jar,但是实际上lib里面没有这个jar。
16、使用Intent时出现另一个活动未发现的异常(ActivityNotFoundException)
解决方案:在AndroidManifest.xml中再加一个
17、Fail to connect to camera service
在AndroidManifest.xml中添加
如果还是不行
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera.stopPreview();
mCamera.release();//加上这句,就OK!
mCamera=null;
}
18、android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
解决方法:将new AlertDialog.Builder(Context context)中的参数用Activity.this(Activity是你的Activity的名称)来填充就可以正确的创建一个Dialog了。
导致报这个错是在于new AlertDialog.Builder(mcontext),虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。
19、java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
在任务管理器中终止adb服务,关闭手机调试或者模拟器,重启就好了。
http://hi.baidu.com/o%B0%D7%C9%AB%B5%C4%D4%C6/blog/item/024c3c6bfb6440c180cb4a3d.html
20、java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout
两个表示位置的属性不能同时使用,但是有些一起用又没有报异常,不太了解。
如android:layout_alignParentTop="true" android:layout_centerHorizontal="true"
21、No resource found that matches the given name
在相对布局中,若是用到android:layout_above属性,并且其后id之前没有出现过,那么需要这样写:android:layout_above="@+id/vidAdd_ButtonGroup",多加一个“+”。
22、@Override错误
Window->Preferences->Java->Compiler.
把Compiler compliance level的级别改成1.6,每个工程属性里只要默认设置就行了,不要设置specific.
23、PANIC: Could not open: C:UsersLanyan.android/avd/SDK2.2.ini
添加android_sdk_home系统变量,其值为想要保存avd的目录,例如我放在D:Program Filesandroidavd下。
24、Activity has leaked window that was originally added
原因1:重写onKeyDown时,return super. onKeyDown(int keyCode, KeyEvent event)没有修改;
原因2:关闭Activity时,没有关闭AlertDialog造成的。
法一:将return super. onKeyDown(int keyCode, KeyEvent event)改为return false;
法二:@Override
protected void onPause()
{
super.onPause();
//关闭对话框
AlertDialog.dismiss();
}
法三:AndroidManifest.xml中,在相应的节点中添加
android:configChanges="orientation|keyboardHidden|navigation"
25、unable to instantiate application
解决方法1:在AndroidManifest.xml中的application里的android:name要去掉;
解决方法2:全局类或者变量私有;
解决方法3:package路径错误。
26、IllegalArgumentException 'Provider "gps" unknown"
locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);触发不了LocationManager
加入以下一段参数就好了:
mLocationManager.addTestProvider(LocationManager.GPS_PROVIDER,
"requiresNetwork" == "", "requiresSatellite" == "", "requiresCell" == "", "hasMonetaryCost" == "",
"supportsAltitude" == "", "supportsSpeed" == "",
"supportsBearing" == "", android.location.Criteria.POWER_LOW,
android.location.Criteria.ACCURACY_FINE);
27、Unable to resolve target 'android-2'
安装低版本的api,再default.properties 这个文件中把target=android-2 改成 target=android-7终于就没有问题了。
28、Invalid start tag LinearLayout
main.xml放错文件夹了,应该在reslayout下。
29、INSTALL_FAILED_INSUFFICIENT_STORAGE
原因:SD卡内存容量不够
法一:在下图的“Additional Emulator Command Line Options”中加上“-partition-size 128”
法二:启动模拟器,然后进入菜单
settings->applications->mange applications-> select the application->select "unistall".
这样就能彻底删除了,然后再重新安装这个apk就没问题了
30、No Space left on device
清除C:UsersLanyanAppDataLocalTempAndroidEmulator文件夹下的tmp文件
参考资料:http://hi.baidu.com/boderboder/blog/item/af2a81de31dc3f235982ddd8.html
31、Could not open the editor: Resource is out of sync with the file system
当右击default.properties打开时,出现下图错误:
解决方法:右击工程,Refresh一下就好了。
原因:Usually happens when some files are edited outside of eclipse。
声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息
原文作者: 风雪~泪

2013年12月30日 星期一

2013年12月18日 星期三

[Android] 在APP 裡面呼叫Line APP

Line跟facebook一樣在安裝了 Line/Facebook app後,
可以簡單的利用startActivity來進行一些簡單的PO文動作, 也就是藉由他本身的
app去執行api。
相反來說, 若是想利用自己的app去發request 就要去add naver/facebook 的library, 這樣能做到的事更多, 但是較為麻煩。
這邊將介紹如何透過簡單的方式來PO文到line上

//判斷是否安裝了line
private boolean checkLineInstalled(){
PackageManager pm = getPackageManager();
m_appList = pm.getInstalledApplications(0);
boolean lineInstallFlag = false;
for (ApplicationInfo ai : m_appList) {
if(ai.packageName.equals(PACKAGE_NAME)){
lineInstallFlag = true;
break;
}
}
return lineInstallFlag;
}

//PO文字
public static final String PACKAGE_NAME = "jp.naver.line.android";
public static final String CLASS_NAME = "jp.naver.line.android.activity.selectchat.SelectChatActivity";
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setClassName(PACKAGE_NAME, CLASS_NAME);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, sendText);
startActivity(intent);

//PO圖片
String fname = "send_image.jpg";
String fileFullPath = Environment.getExternalStorageDirectory().getAbsolutePath()
+ File.separator + fname;

Uri uri = Uri.fromFile(new File(fileFullPath));
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setClassName(PACKAGE_NAME, CLASS_NAME);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(intent);

Reference: https://gist.github.com/ekos/3993270

帶出所以有可以share的app
Reference:http://orgcent.com/android-app-intent-share-list/

2013年12月17日 星期二

[Android] VersionCode 和 versionName 用法


android:versionCodeandroid:versionName用法
Android 開發程式的版本 在androidmainfest.xml中定義,
android:versionCodeandroid:versionName兩種

A.android:versionCode:主要是用於版本升級所用,是INT 整數類型,第一個版本定義為1,以後遞增,這樣只要判斷該值就能確定是否需要升級,該值不顯示給使用者觀看
B.android:versionName:程式版本號碼,由三部分組成<major>.<minor>.<point>,該值是個字串,可以顯示給使用者看。
範例如下
<?xml version="1.0" encoding="utf-8"?>
<manifest ....
package="com.xxx.xxx"
android:versionCode="2"
android:versionName="1.1">
......
versionCode是給設備程式識別版本(升級)用的,必須是一個interger值,整數,代表app更新過多少次
versionName是給用戶看的,可以寫1.1 , 1.2等等版本
延伸出另外一個問題:當app需要校對版本的時候怎樣讀取這個值?
1、讀取manifest.xml
PackageManager pm = context.getPackageManager();//context為當前Activity上下文
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
version = pi.versionName;
2、在裡面定義 android:versionName="@string/app_versionName" 然後在 res/values/strings.xml 裡定義一個同名 string item <string name="app_versionName">1.1</string>

原文參考:http://www.haogongju.net/art/2364600

2013年12月16日 星期一

[Android] 聖歌精選神愛世人 Jesus is Lord

 
聖歌精選神愛世人YOUTUBE
或以QRCODE下載
 
 方便使用
安裝完成
開啟即自動撥放歌曲
點選"歌曲清單"會顯示所有曲目
 

手機螢幕橫置
畫面自動全螢幕

 
PS: 有3G流量限制者建議使用wifi 無線網路
12/18 增加 Line 分享傳訊連結下載功能

2013年12月15日 星期日

[DB] SQLITE DB TOOLS 整理

[DB] SQLITE DB TOOLS 整理
從網路上找了一些免費的工具整理如下:

http://sqliteadmin.orbmu2k.de/
SQLite Administrator - International Milestone Beta
SQLite Administrator is a powerful tool if you easily want to create, design or administrate
SQLite database files. The SQL code editor helps you to quickly write sql queries with
features such as code completion and highlighting. Both major versions of SQLite database
files are supported by SQLite Administrator.

Features:
•Create / Modify / Delete Tables by Wizard
•Create / Modify / Delete Indices by Wizard
•Create / Modify / Delete Views by Wizard
•Create / Modify / Delete Triggers by Wizard
•SQL Code Completion that supports table aliases
•SQL Code Highlighting
•SQL Error Locating
•Import Data from CSV Files
•Export Data ( XLS / CSV / HTML / XML )
•Store User Queries into Database
•Search for User Queries
•Store Images into Blob Fields ( JPG / BMP )
•Show SQL of each Database Item
•Migrate SQLite2 Databases to SQLite3
•Try to keep Indices and Triggers after modifying a Table

Supported Languages:
•German
•English
•French - [by Stephane Wierzbicki]
•Portugues (BR) - [by mamede]
•Spanish - [by Jenaro Centeno Gómez]
•Dutch - [by Johan Samyn]
•Simplified Chinese - [by Zuo Weiming]
•Russian - [by Ormada]
•Polish - [by Piotr Drozdowski]
•Italian - [by Paolo Paniga]
•Hungarian - [by Zsolt]
•Norwegian - [by Glenn O Larsen]
•Turkish - [by Ismail Ata KURT]
•Czech - [by Robert Hroch]
•Traditional Chinese - [by Ben Su]
•Danish - [by Morten Skytte]
•Greek - [by Papadoulas Konstantinos]
•Catalan - [by Blas López]

Supported Operating Systems:
•Windows 2000
•Windows XP
•Windows Vista

Sqlite Loader
import csv tool
sqliteloader.codeplex.com
只能 load csv 到 sqlite database

名稱:SQLite Database Browser
網站:http://sqlitebrowser.sourceforge.net/
分類:桌面程式(支援Win/Mac/Linux)

名稱:SQLite Database Browser
網站:http://code.google.com/p/sqlite-manager/
分類:Firefox外掛套件

名稱:SQLiteStudio
網站:http://sqlitestudio.one.pl/index.rvt
分類:桌面程式(Win/Mac/Linux)
名稱:Lita
網站:http://www.dehats.com/drupal/?q=node/58#install
分類:桌面程式-AIR(Win/Mac/Linux)

SQLite資料庫管理工具 ─ SQLite Expert
SQLite Professional是一個功能強大的視覺化工具,讓您可以輕鬆管理您的SQLite3資料庫,並獲得顯著
且更好的資料庫操作可視性。SQLite Professional集成資料庫管理和維護成一個單一無縫的環境,具有明
確和直觀的圖形用戶界面。
而在PC上有不少的SQLite管理工具,大部分是需要收費的,少部分免費的卻又支援度不足,後來終於發現
到SQLite Expert這一套相當好用的SQLite資料庫軟體,官方一共有兩個版本,一為免費的個人版,二是付
費的專業版,對我們準備用來管理SQL資料庫的資料來說,免費版就已經相當的夠用了。
要想開發後端程式,您就一定要學會如何操控SQLite,而SQLite Exper能讓您管理資料就像使用Access一
樣的簡單,推薦給您。
官方下載:SQLite Expert Personal 1.7.64 (Freeware)
官方網站:http://www.sqliteexpe

2013年12月4日 星期三

[Android] App安裝在外部SD卡

[Android]App安裝在外部SD卡

在AndroidManifest.xml裡增加程式描述,指定此App是安裝位置:安裝於手機,安裝在外部SD卡, 或自行選擇其一

範例如下是最常用兩者皆可的寫法

  <manifest   xmlns:android="http://schemas.android.com/apk/res/android"
  android:installLocation="auto">

使用android:installLocation此屬性即可,有三個選項

1.internalOnly(只能安裝在手機裡)

2.preferExternal(安裝至外部SD卡裡)

3.auto(手機內部或外部SD卡兩者皆可)

如果沒有指定的話,

系統會內定只能安裝在手機內部

[ANDROID] 上架後 admob 橫幅廣告 NO SHOW?

頭一次將app上架在Google Play 商店發現下載下來的app程式admob 橫幅廣告
無法顯示出來,乖乖,不是測試都完成,顯示也正常,怎麼上傳後出槌了...
先前也沒學到這段,自己靠著實際摸索,摸索,爬文爬文硬是上架
到底是哪個步驟少掉了呢?
左想右想,摸摸鼻子,靈光一現...好像北海小英雄的畫面出現,呵呵
原來當時的package name 是使用測試名稱
當下回到admob 網站
將package name 修正為正式發布版本的名稱
再次測試就出現了

 
(按:Android 應用程式應該使用哪個網址?
 如果您是 Android 開發人員,請按照以下格式輸入應用程式的網址:market://details?id= , 代表應用程式的套件名稱。)

就是這裡啦
記得要更新ANDROID MARKET URL 的 PACKAGE NAME !!!
紀錄一下免得下次忘了!



後記:
另外
參考到 MAX 的 心得筆記
居然還有被下架停權的事情發生:

your application, package ID xxx has been removed from the Google Play Store
上架到  Google Play Store 被停權是很常見的事情, 收到 google 寄來的 package 被停權, 要先看看被停權的原因是什麼, 如果只是關鍵字下太多, 這個就很好解決, 重新改一個 package ID 重新上架就OK, 聽說關鍵字下太多, 只有App 被下架, 不會停用 AdMob 裡的廣告.
如果你的AdMob裡的應用程式也被停用的話, 請在AdMob裡再開立一個新的應用程式, 並在 Google  廣告的選項, 選取 "不要使用 Google 廣告和 Google 認證廣告聯播網來提高廣告供應率。". 如此一來, 就可以在 Google Play 以外的地方繼續賺取廣告收入.

 
為避免, 已經被下載 & AdMob 應用程式被停止的App收不到之後的廣告收入, 建議在程式碼裡, 加入自動檢查新版本的功能, 參考這篇文章:

參考一下,希望別遇到...

2013年11月28日 星期四

[APP 作品] Android TV BOX 飯店電視選單系統 Hotel TV Menu

偶然的狀況下同鞋請我幫忙寫了這個飯店的HotelTVmenu選單系統,使用Android TV Box
做飯店的介紹,電視功能,多媒體播放功能......等等
前導頁是多國語言選單,先選擇正體(繁體)中文,簡體中文,英文,日文後進入下面功能選單

 
之後進入飯店介紹一
介紹二
介紹三
 
介紹四

其餘點選電視按鈕即會進入數位電視DVB-T Tunner 觀看電視節目
節目頻道由飯店電視調配,點選多媒體則由客人(使用者)播放sdcard的音樂,影片,照片等內容
點選說明則顯示按鍵,遙控器使用說明....(也嘗試加上網路收音機,youtube,pps等可欣賞)
所有動作皆是透過遙控器進行


未來可能加入即時訊息傳送,如最新優惠,飯店活動,飯店公告,線上購物,帳單查詢,客房服務...
後臺頁面更新,文字圖片,背景等

[Android] INTEL HAXM 模擬器加速:使用 Intel ATOM 架構

於 Intel® 架構加速 Android* 模擬器

完整原文請參考 intel 網站

摘要:
如果您是 Android* 開發者,且對 Android 模擬器的效能不太滿意,那麼請務必閱讀本篇文章。Android 開發者總是對模擬器的效能怨聲載道,抱怨速度緩慢、使用起來痛苦不堪,實在不該如此。現在,只要您的電腦正常更新、具備內建 Intel® 虛擬化技術的 Intel® 處理器、可執行 Microsoft Windows* 或 Apple Mac OS* 系統,即可使用 Intel® 硬體加速執行管理器 (Intel® HAXM),輕鬆將 Android 模擬器的速度加快至一定程度,縮短 Android 應用程式測試與除錯所需的時間,若是 Linux 系統則可使用 KVM。本文將詳細說明模擬器加速所需的各項步驟及使用方法,然後再進一步解說如何使用原生開發套件 (NDK) 編譯 x86 原生碼,以及如何將包含 x86 原生資料庫的 Android 應用程序包 (APK) 正確上傳至 Google Play 商店。Intel HAXM 也可以用於加速 Tizen* 模擬器,但不在本文探討範圍內,詳細資訊請見 tizen.org 網站的軟體開發套件 (SDK) 部分。
1. 簡介
本文提供 Intel® 硬體加速執行管理器 (Intel® HAXM) 的安裝教學。Intel® HAXM 是用於輔助硬體的虛擬引擎 (超管理器),採用 Intel®虛擬化技術 (Intel® VT),可促進 Android* 於 Windows* 環境的發展效率。文中也會詳述如何在 Linux* 系統中設定輔助硬體的 KVM,並提供於 x86 架構本機編譯及上傳應用程式至 Google Play 商店的最佳方案。
2. 安裝
2.1. 事前準備
  • 需先安裝 Android 軟體開發套件 (SDK)。請至http://software.intel.com/en-us/android下載。
  • 電腦的 Intel 處理器需支援 Intel VT-x 及延伸記憶體 64 技術 (EM64T),且需在 BIOS 中啟用病毒防護技術 (Execute Disable Bit) 功能。


使用心得:必須是INTEL CPU BIOS 要啟用VT,確實有感覺模擬器快了15~30%,但還是感覺慢啊,只能說總算還是有改善...

也有提供IMAGE 下載

參考其他說明文章

[Android] 新版 Android 4.0 後 run 舊版的 http request 修正 android.os.NetworkOnMainThreadException

解決 android.os.NetworkOnMainThreadException
此文參考 http://my.eoe.cn/iceskysl/archive/4382.html 做一下筆記

好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: android.os.NetworkOnMainThreadException,查了下原因上在4.0之后在主线程里面执行Http请求都会报这个错,大概是怕Http请求时间太长造成程序假死的情况吧。
解决办法有两个思路,分别是:
第一种方法:直接忽视,强制使用(强烈不推荐,但是修改简单)

在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}


第二种方法:使用Thread、Runnable、Handler (推荐使用)
在Runnable中做HTTP请求,不用阻塞UI线程~

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.share_mblog_view);
    new Thread(runnable).start();
}
Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        Bundle data = msg.getData();
        String val = data.getString("value");
        Log.i("mylog","请求结果-->" + val);
    }
}
Runnable runnable = new Runnable(){
    @Override
    public void run() {
        //
        // TODO: http request.
        //
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("value","请求结果");
        msg.setData(data);
        handler.sendMessage(msg);
    }
}

[Android] Source not found

有時在debug 過程會發現一些訊息
有些並不會產生錯誤
有興趣去trace 下去則可對程式更加了解

像這Sorce not found  的訊息,其實只要到 sdk manager 裡勾選,下載所需 package 即可

[Android] asm.jar功能:將手機畫面傳送到 PC 電腦螢幕 Android Screen Monitor

我們在使用Android App 時,有時候須將Android 裝置,如手機,平板畫面投影至螢幕或者投影機上,這時就需要一個小工具來幫忙,所幸Google 貼心的提供了此程式

Android Screen Monitor

The Android Screen Monitor (ASM) is a tool to monitor screen on the device or emulator.
ASM is an Android Debug Bridge (adb) client, When it starts monitoring screen, ASM connects to adb on port 5037 and receives frame buffer continuously on the device or emulator and transfer image to your desktop window.
You can rotate and scaling monitor window and export a image into PNG file as screen shot tool.

asm.jar功能:
1. 可將Android手機畫面連續傳送至PC螢幕上,方便演講者Demo Android手機功能給他人看。
2. 傳送頻率:約1秒傳送1張照片。

asm.jar使用方式:

1. 將adb.exe所在路徑加到path環境變數。
2. adb.exe檔案在一般Android開發會放在Android SDK目錄,例如C:\android-sdk-windows\platform-tools
3. adb.exe檔案在AppInventor則會放在C:\Program Files\AppInventor\commands-for-Appinventor
4. 命令列執行: java -jar asm.jar

參看:
http://code.google.com/p/android-screen-monitor/
 
asm.jar 下載連結

System Requirements

  • Ver.2.00 - 2.50
    • JRE(JDK) 5 or 6 and must set path to java bin directory
    • Android 1.5-4.2 SDK and must set path to android sdk tools and platform-tools directory
  • Ver.1.00 - 1.50
    • Windows XP (32-bit) or Vista (32-bit)
    • Android 1.5-1.6 SDK and must set path to android sdk tools and platform-tools directory

Install

  1. Install JRE(JDK) 5 or 6 and set path to java bin directory
  2. Install Android SDK and set path to android sdk tools and platform-tools directory
  3. Download Android Screen Monitor

[Android] SQL Connect Test

//先下載JTDS JDBC DRIVER 放到PROJECT 的LIBRARY中

package com.example.sqlconntest;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//import com.example.sqlconntest.R;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity
{

 private String UserName = "sa";
 private String Password = "111";


    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        ConnectTask dt = new ConnectTask();
        dt.execute();
    }
   
    class ConnectTask extends AsyncTask<Integer, Integer, String>
    {
     Connection con = null;
     @Override
  protected void onPreExecute() {
       super.onPreExecute();
  }
   
  @Override
  protected String doInBackground(Integer... params) {
   TextView tv;
   tv=(TextView)findViewById(R.id.textView1);

   //建立資料庫連接
   try {
    Class.forName( "net.sourceforge.jtds.jdbc.Driver");
    con = DriverManager.getConnection( "jdbc:jtds:sqlserver://10.0.2.2:1433/travel", UserName, Password);   
//10.0.2.2是使用模擬器的PC本機IP,TRAVEL 是我的DB NAME
    testConnection(con);
    tv.setText("連結資料庫成功!");
   } catch (ClassNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    tv.setText("Driver error");
    Log.e("Class.forName::ClassNotFoundException", e1.getMessage());
   }catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     tv.setText("Connection Error");
   }

   return "OK";
  }
  @Override
  protected void onPostExecute(String result) {
   super.onPostExecute(result);
  }

  public void testConnection(Connection con) throws java.sql.SQLException {         
         try {   
             String sql = "SELECT * FROM 景點資料 Where Region='台北市'";
             Statement stmt = con.createStatement();
             ResultSet rs = stmt.executeQuery(sql);
            
             while (rs.next()) {
                 Log.e("&&&&&", rs.getString("NameChs"));
                 Log.e("&&&&&", rs.getString("OperateUserName"));                  
             }   
             rs.close(); 
             stmt.close(); 
         } catch (SQLException e) { 
             System.out.println(e.getMessage().toString()); 
         } finally { 
             if (con != null) 
                 try { 
                     con.close(); 
                 } catch (SQLException e) { 
                 } 
         } 
     }
    }
}

[Android] Http Client

import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

public class CustomHttpClient {
    private static HttpClient customHttpClient;

    /** A private Constructor prevents instantiation */
    private CustomHttpClient() {
    }

    public static synchronized HttpClient getHttpClient() {
        if (customHttpClient == null) {
            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
            HttpProtocolParams.setUseExpectContinue(params, true);
            HttpProtocolParams.setUserAgent(params,  "Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" );
            params.setParameter("charset", "UTF-8"); // 要設成utf-8,否則中文的utf-8網頁會出錯
            ConnManagerParams.setTimeout(params, 1000);

            HttpConnectionParams.setConnectionTimeout(params, 5000);
            HttpConnectionParams.setSoTimeout(params, 10000);

            SchemeRegistry schReg = new SchemeRegistry();
            schReg.register(new Scheme("http",  PlainSocketFactory.getSocketFactory(), 80));
            schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
            ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params,schReg);
            customHttpClient = new DefaultHttpClient(conMgr, params);
        }
        return customHttpClient;
    }
}

2013年11月27日 星期三

[Android] Bluetooth 參考文件

http://developer.android.com/guide/topics/wireless/bluetooth.html
http://www.anddev.org/serial_over_bluetooth_simple_test_client-t11106.html

[Android] Call another APK file

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(new
        File(Environment.getExternalStorageDirectory() + "/path/"
        + "app_apk.apk")), "application/vnd.android.package-archive");
        CurrentActivity.this.startActivity(intent);

[Android] read image from sdcard


File sdCard = Environment.getExternalStorageDirectory();
File directory = new File (sdCard.getAbsolutePath() + "/Pictures");
File file = new File(directory, "image_name.jpg"); //or any other format supported
FileInputStream streamIn = new FileInputStream(file);
Bitmap bitmap = BitmapFactory.decodeStream(streamIn); //This gets the image
streamIn.close();

[Android] 圖片放大修改

Android 圖片放大修改
package com.Demo;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
public class TestImage extends Activity {
/** Called when the activity is first created. */
private static final String tag = "TestImage.............";
String imageUrl= "http://ccleu.blogspot.tw/image/test_img.png";
Bitmap bmImg;
ImageView imView;
Button button1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imView = (ImageView) findViewById(R.id.imview);
imView.setImageBitmap(returnBitMap(imageUrl));
Bitmap bitmap = returnBitMap(imageUrl);
imView.setImageDrawable(resizeImage(bitmap, 600, 600));
}
public Bitmap returnBitMap(String url) {
URL myFileUrl = null;
Bitmap bitmap = null;
try {
myFileUrl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
Log.v(tag,bitmap.toString());
return bitmap;
}
public static Drawable resizeImage(Bitmap bitmap, int w, int h) {
// load the origial Bitmap
Bitmap BitmapOrg = bitmap;
int width = BitmapOrg.getWidth();
int height = BitmapOrg.getHeight();
int newWidth = w;
int newHeight = h;
Log.v(tag,String.valueOf(width));
Log.v(tag,String.valueOf(height));
Log.v(tag,String.valueOf(newWidth));
Log.v(tag,String.valueOf(newHeight));
// calculate the scale
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the Bitmap
matrix.postScale(scaleWidth, scaleHeight);
// if you want to rotate the Bitmap
// matrix.postRotate(45);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width,height, matrix, true);
// make a Drawable from Bitmap to allow to set the Bitmap
// to the ImageView, ImageButton or what ever
return new BitmapDrawable(resizedBitmap);
}
}