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

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

アプリの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

[Accessibility] Missing contentDescription attribute on image

よくあることなので、メモ書きしておきます。レイアウト XML 定義で ImageView を作成した時に android:contentDescription 属性の定義を忘れていると発生するので、きちんと書きましょうw

HTML5 コンテンツをアプリに同梱し、WebView で表示する方法

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");
    }

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

Copyright © 2011 HuNavi. All Rights Reserved.

このページの先頭へ