京都のスマートフォン・アンドロイドアプリ開発会社のサイトです!

開発日記
当社アプリに関するお知らせや開発裏話を綴ります。

アプリのAPI Level の変更

昔、開発した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 : “

評価のため、適当に作ったプロジェクトを流用して作業する場合に、よくパッケージ名を変更せざるを得ないことがおきる。
※そもそも、新規にプロジェクトを作成すれば、こんな問題は起きないかもしれない(汗)

パッケージ名をレファクタリングすれば、ソースコード一式はパッケージ名は変更してる。そこまで順調だがビルドしようとすると、以下のようなメッセージが出たビルドすることができない

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

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

Android NFC リーダ感度

NFC 搭載のアンドロイド端末のNFCリーダの感度(カードをかざした時に認識する距離や方向、時間など)は、端末によってまちまちですが、パソコンなどで使う USB 接続の卓上型 NFCリーダーに比べると感度が悪いと思います。アンドロイド端末は、さまざまな機能が小さい端末内部に集約しているので、それぞれが干渉しないように配慮や、バッテリなどの関係があるので、卓上型NFC リーダと比較するものではないですが、NFC を使ったアプリを開発した際に、感度については言われることがあります。
アンドロイド端末は、USB ホスト機能をもった端末もありますので、そのUSBホスト機能をもった端末に卓上型NFCリーダを接続できれば、感度の問題も解消されると思い、探してみるとすでに開発をしてソースコードを公開していただいておりました!
参考までに、http://www.cc.kumamoto-u.ac.jp/nagai/apps/FCFReaderForPaSoRi

 

Android NDK と libHaru を用いたPDF 生成

Java で PDF を生成するのに iText が有名ですが、今回は、C言語で書かれている libHaru を用いて PDF ファイルを生成するアプリを評価しました。
参考サイトを参考にして、libHaru を組み込んでみました。まず、NDK のビルドが簡単になっていることに驚きました!簡単になったと聞いていたけど、実際に作業をしたときに、その差にかなり大きかったです。
参考サイトでは、cygwin をインストールする説明のURL がありましたが、いまは、cygwin もインストールいらないようです。

PDF 生成を libHaru に渡すので、Android 側からは必要なデータのみを渡してあげれば、PDF ファイル生成を行ってくれます。ただし、日本語を扱う場合は、MS932 コードに変換して、libHaru に渡してあげる必要があるので、注意が必要です。

参考サイト: http://d.hatena.ne.jp/Korsakov/20110926/1317050954
Android NDK 環境構築の参考 サイト:  
http://note.chiebukuro.yahoo.co.jp/detail/n136598

 

Nexus7 × 5

あるお客様に納品する予定の端末をお借りして、激写!!

Nexus7 × 5

Nexus7 × 5

Nexus 7

運よく手に入りました!

Nexus 7

Nexus 7

BroadcastReceiver をインナークラス

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
        }
    }
 
    :
}

外部ライブラリ VerifyError Could not find class ’{class name}’ referenced from method ‘{method name}’

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

Android で RSS/ATOM データをパース(解析)する

Java の場合、jdomROME ライブラリを用いて、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();
}

Copyright © 2011 HuNavi. All Rights Reserved.

このページの先頭へ