昔、開発したAndroid アプリでひっぱり出してきて、最新の SDK でビルドしようとすると、古いバージョンのAPIライブラリが開発PCに入っていないことが多くあります。
その場合、project.properties ファイルを変更します
# Project target.
target=android-8
と API Level 8 で書かれているアプリだとします。それを API Level 17 にしたい場合場合、
# Project target.
target=android-17
と書き換えてください。
ただし、書き換えたことで、API によっては、廃止されたメソッドなどがあるので、そこは手動で修正するしかありません。
評価のため、適当に作ったプロジェクトを流用して作業する場合に、よくパッケージ名を変更せざるを得ないことがおきる。
※そもそも、新規にプロジェクトを作成すれば、こんな問題は起きないかもしれない(汗)
パッケージ名をレファクタリングすれば、ソースコード一式はパッケージ名は変更してる。そこまで順調だがビルドしようとすると、以下のようなメッセージが出たビルドすることができない
The project was not built due to "A resource exists with a different case: '/プロジェクト名/bin/classes/パッケージ名'.".
Fix the problem, then try refreshing this project and building it since it may be inconsistent 旧パッケージ名
で、調べると AndroidManifest.xml ファイルの manifest タグの package 属性が変わっていない事に対するエラーだった。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="旧パッケージ名"
android:versionCode="1"
android:versionName="1.0" >
:
</manifest>
manifest タグの package 属性を正しいパッケージ名にするのと、gen ディレクトリ配下にあるファイル一式を削除すればビルドが通ります。
Bluetooth との通信において、UUID がわからないと正しく通信できないので、自分勝手によく使う分だけまとめてみました。
残りは、参考URL をご参照ください。
Serial Port Profile (SPP) | 00001101-0000-1000-8000-00805F9B34FB |
---|---|
Headset Profile (HSP) | 00001108-0000-1000-8000-00805F9B34FB |
Advanced Audio Distribution Profile (A2DP) AudioSource | 0000110A-0000-1000-8000-00805F9B34FB |
Advanced Audio Distribution Profile (A2DP) AudioSink | 0000110B-0000-1000-8000-00805F9B34FB |
Health Device Profile(HDP) | 00001400-0000-1000-8000-00805F9B34FB |
Health Device Profile(HDP) HDP Source | 00001401-0000-1000-8000-00805F9B34FB |
Health Device Profile(HDP) HDP Sink | 00001402-0000-1000-8000-00805F9B34FB |
参考URL: https://www.bluetooth.org/en-us/specification/assigned-numbers-overview/service-discovery
よくあることなので、メモ書きしておきます。レイアウト XML 定義で ImageView を作成した時に android:contentDescription 属性の定義を忘れていると発生するので、きちんと書きましょうw
HTML5 コンテンツをアプリに同梱し、表示させる場合、WebView を用いて表示することができる。
まず、レイアウトに WebView を追加する。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <WebView android:id="@+id/webView1" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> |
読み込む HTML5 コンテンツを assets ディレクトリ以下に配置し、レイアウトを読み込む Activity にて、loadUrl を実行する。その際、assets ディレクトリを示すURI が
file:///android_assets/
になる。
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); webview = (WebView )findViewById(R.id.webView1); webview.getSettings().setJavaScriptEnabled(true); // javascript を有効 webview.setVerticalScrollbarOverlay(true); // 右10pxの余白を消す webview.loadUrl("file:///android_asset/index.html"); } |
AlartManager で一定間隔で処理を実行したい場合に、プログラム上インナークラスを定義したいときがある。AlartManager でBroadcastReceiver を継承したクラスを生成した場合、AndroidManifest.xml にそのクラスを定義する必要がある。
インナークラスの場合は、その親クラス名と$を付与した名称で記述することができる。
<receiver android:name="TestActivity$TestService"></receiver> |
その場合、大事なのが、インナークラスを static にする必要がある。
public class TestActivity extends Activity { : public final static class TestService extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { // process } } : } |
Android SDK Tools を Rev. 17 にバージョンアップしたら、以前まで動いていた外部ライブラリを必要とするアプリケーションで、突然ビルドできなくなってしまった。ビルドして、実行すると以下のようにメッセージが表示され、Could not find class で NoClassDefFoundError の例外処理が実行されてしまいます。
Could not find class ’{class name}' referenced from method '{method name}'
いろいろと検索してみると、Build Path の設定で、Order And Export に利用している外部ライブラリにチェックを入れないといけないことがわかった。
[追記]
Eclipseでjarのライブラリを使う場合、libsフォルダに入れるだけでビルドパスの追加は必要が無いようです。詳細は、下記のURLを参照してください。
http://d.hatena.ne.jp/Tackn1977/20120410/1334009456
文字列リソース(strings.xml)にて、@(アットマーク)や?(クエスションマーク)を記述したい場合がある。以下のように記述しても、実行時にエラーになってしまいます。
<string name="address">@gmail.com</string> |
Android 開発において、@(アットマーク)や?(クエスションマーク)は特別な意味を持っているため、エスケープ文字で記述します。
<string name="address">"@"gmail.com</string> |
その他の文字列については、下記の URL を参考にする必要があります。
http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling
Java の場合、jdom や ROME ライブラリを用いて、RSS/ATOM をパース(解析)することがあります。残念ながら、このライブラリを Android でそのまま利用しても実行途中でエラーになってしまい使用することができません。ROME は、Apache License 2.0 の元で配布されているオープンソースの Java ライブラリです。
そこで、Android 版 ROME を用います。
使い方は、簡単です。
SyndFeedInput input = new SyndFeedInput(); try { String xml = "<?xml version="1.0" encoding=\"utf-8\" ?><rdf:RDF xmlns=\"http://purl.org/rss/1.0/\">...</rdf:RDF>"; SyndFeed feed = input.build(new StringReader(xml)); for (Object obj : feed.getEntries()) { SyndEntry entry = (SyndEntry) obj; // ArrayAdapter に追加 } } catch (IllegalArgumentException ex) { ex.printStackTrace(); } catch (FeedException ex) { ex.printStackTrace(); } |
先日、パナソニック様の業務向けタブレット端末に関するセミナーを聞きに行ってきました。後発ともありパナソニック様の気迫を感じる製品でした。Android OS は、3.2 ではありますが、7インチ型モデルは手袋をしたままで操作ができる抵抗膜方式のタッチパネルを採用しております。CPU は、ARM のCortex-A9 の Dual コアを採用されており、動作的にも問題はないように思いました。特に気になっているのが、USB 2.0 のホストモードが正式に搭載されていることです。いよいよ Android タブレットに USB 周辺機器が接続され、より多くの利用が見込まれることが予想されます。
今後のパナソニック様のタブレット端末は、注目です。