2019年12月29日日曜日

ban されたアプリにプライバシーポリシーを追加

去年の7月にリリースしたアプリが今年の3月に Play store から ban された。忙しくて放置していたのだが、年末に時間ができたので対応。

主に参考にしたのはこちら
Firebase Hosting でサイトを公開するのに参考にしたのはこちら

細かいほぼ一年半ぶりに Android  開発したこともとあってこまごまとしたところで躓いたが、半日ほどでリリース申請までこぎつけた。

2016年10月7日金曜日

Error:Could not find com.android.tools.build:gradle:2.2.0.

Android Studio を Update した。

例によって Sync し直すよ!と言ってきたので、OK とするとエラーが

Error:Could not find com.android.tools.build:gradle:2.2.0.
Searched in the following locations:
    https://repo1.maven.org/maven2/com/android/tools/build/gradle/2.2.0/gradle-2.2.0.pom
    https://repo1.maven.org/maven2/com/android/tools/build/gradle/2.2.0/gradle-2.2.0.jar
Required by:
    XXXX.plugins:openpgp-api-library:unspecified

調べてみると、gradle を勝手にネットから引っ張て来るのだが、2.2.0 が maven にはなくて、jcenter から取ってこなくてはならなくなったらしい。

https://wasabeef.jp/android-gradle/

http://stackoverflow.com/questions/38702032/android-studio-gradle-refresh-failed-could-not-find-com-android-tools-buildg

で、build.gradle jcenter() を追加したのだがうまくいかない。

調べていくと、mavenCentral() が build.gradle 以外にもあった。なので全部に jcenter() を追加したらうまくいった。

2016年7月16日土曜日

cordova: 'Could not find any version that matches com.google.android.gms:play-services-gcm:+.' で build に失敗したら

 初めての cordova 案件が数か月放置された cordova のプロジェクトをメンテ。

 まずは環境を作り。こちらのページを参考に Mac に cordova 環境を構築。Android、iOS ともに空プロジェクトを作って build が成功するところまでできた。

 続いてターゲットのソースを git からクローンして build。Android も iOS も失敗。まずは Android から調査開始。
 最初は SDK が足りないということで SDK Manager から追加して終わり。次のエラーが

 'Could not find any version that matches com.google.android.gms:play-services-gcm:+.'

 ということなのだが、 Google play services は追加済。調べていくと Google Repository も必要ということで追加したのだが、変わらず。

 あれこれ調べていくうちに、どうもあるべき場所にあるべきファイルがない気がしてきた。そこで気が付いたのだが、いままでは Android studio から SDK Manaeger を起動していたのだが、ターミナルから SDK Manager を起動すると、案の定 Google Repository がインストールされていない。
 こちらから Google Repository をインストールすると build に成功した。

もしかして、一部 SDK が複数個所に格納されているのかもしれない。

2016年4月15日金曜日

nexus9:OpenGL GL_TRIANGLE_STRIP の不可解な動作

 Android アプリを開発中、手持ちの3機種ではそれなり安定して動いていたアプリが、出先で借りた nexus9(6.0.1 MMB29V) では動かなかった(「問題が発生したため、~を終了します。」)
 
 ご厚意で nexus9 をお借りし、自宅で調べてみると、見たことのないメッセージを出して止まっていた。
 
> 04-15 15:20:42.739 11046-11534/sample.ble.sensortag D/NvOsDebugPrintf: WARNING: Couldn't find glCurrentPaletteMatrixOES in procAddrs table
>04-15 15:20:42.739 11046-11534/sample.ble.sensortag D/NvOsDebugPrintf: WARNING: Couldn't find glLoadPaletteFromModelViewMatrixOES in procAddrs table
>04-15 15:20:42.739 11046-11534/sample.ble.sensortag D/NvOsDebugPrintf: WARNING: Couldn't find glMatrixIndexPointerOES in procAddrs table
>04-15 15:20:42.739 11046-11534/sample.ble.sensortag D/NvOsDebugPrintf: WARNING: Couldn't find glWeightPointerOES in procAddrs table
>04-15 15:20:42.804 11046-11534/sample.ble.sensortag A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 11534 (GLThread 367)

 ネットで調べてみたが、役に立つ情報が見つからない。ブレークポイント仕込んで調べていくと、OpenGL で直線を引くための class の、直線を引くメソッドで止まっていた。
 
 直線は、三角形を二つ並べることで描いていて、コード的には
 
     (略)
            float squareCoords[] = {
                (float) (xs - (Math.cos(angle) * width / 2)), (float) (ys + (Math.sin(angle) * width / 2)), 0,     // top left

                (float) (xs + (Math.cos(angle) * width / 2)), (float) (ys - (Math.sin(angle) * width / 2)), 0,     // top right

                (float) (xe - (Math.cos(angle) * width / 2)), (float) (ye + (Math.sin(angle) * width / 2)), 0,     // bottom left

                (float) (xe + (Math.cos(angle) * width / 2)), (float) (ye - (Math.sin(angle) * width / 2)), 0     // bottom righ
           };

         short drawOrder[] = {0, 1, 2, 3}; // order to draw vertices
         (略)
         gl.glDrawElements(  // draw shape:
                GL10.GL_TRIANGLE_STRIP,
                mDrawOrder.length, GL10.GL_UNSIGNED_SHORT,
                drawListBuffer);
 
 はたと思うところあって、GL_TRIANGLE_STRIP を GL_TRIANGLES に変更し、drawOrder[] もそれに合わせて {0, 1, 2, 1, 2, 3} に変更したところ、エラーは出なくなった。GL_TRIANGLE_STRIP で、三角形を二つしか書かないのは少なすぎるのだろうか。


 円を描くところでは、glDrawElements() に GL10.GL_TRIANGLE_STRIP を指定して問題なく動いているのだが...。
 
 ともあれ、問題を一つ越えられた ><
 

2016年2月24日水曜日

古いサンプルを Android Studio で動かす方法

Android developer (google の公式) の Displaying Graphics with OpenGL ES にある sample (OpenGLES.zip) の HelloOpenGLES10 を Android Studio で動かそうとして、File -> New Import Project でインポートしたのだが

- Error:A problem occurred configuring project ':app'.
- > failed to find target with hash string 'android-4' in: C:\Users\mugi\AppData\Local\Android\sdk
- <a href="openAndroidSdkManager">Open Android SDK Manager</a>

なるエラーが出てきた。

結局、

・ SDK Managear の SDK Tools タグから Android SDK Build Tools をインストール
・HelloOpenGLES10\app\build.gradle の compileSdkVersion を 4 から 21 に変更

でビルド -> 実機動作までできるようになった

2016年1月20日水曜日

BLE Advertise の GAP(Data Type Value) の指定方法

  いろいろなコードを参考にしながらいろいろ試して、BLE Advertise はできるようになったのだが、GAP の Data Type Value (AD Type) がどうしても設定できない。
 
 参考にしたコードによって Data Type Value (AD Type) の値は違うのだが、なぜ違っているのがわからなくてかなり調べた。調べた結果...
 
  • Data Type Value (AD Type) は直接指定できない
  • AdvertiseData.Builder,AdvertiseSettings.Builder のメソッドを呼ぶことで、Advertise に特定の AD Structure を追加できる
  •  Advertise に AD Structure を追加する方法はこれしかないらしい(API level 21:Android 5.0)
  • 結局、Data Type Value (AD Type) を設定するのは、AdvertiseData.Builder,AdvertiseSettings.Builder のメソッドを選ぶこと


AdvertiseData.Builder のメソッドで付加される AD Structure
Data Type Value Data Type Name Method
0x03 Complete List of 16-bit Service Class UUIDs addServiceUuid(ParcelUuid serviceUuid)
0x09 Complete Local Name setIncludeDeviceName(boolean includeDeviceName)
0x0A Tx Power Level setIncludeTxPowerLevel(boolean includeTxPowerLevel)
0x16 Service Data - 16-bit UUID addServiceData(ParcelUuid serviceDataUuid, byte[] serviceData)
0xFF Manufacturer Specific Data addManufacturerData(int manufacturerId, byte[] manufacturerSpecificData)

AdvertiseSettings.Builder のメソッドで付加される AD Structure
Data Type Value Data Type Name Method note
0x01 Flags setConnectable(boolean connectable) connectable:true の時だけ Flags:0x02(LE General Discoverable Mode)のAD Structureが入る
connectable:false だと挿入される AD Structure はなし

2015年12月14日月曜日

Nexus5 で、bluetooth LE の advertising を送出させる方法

経過:
 思うところあって、いわゆる「Beacon」を使いたくなった。調べていくと、bluetooth LE の advertising という機能を使っているらしい。iOS は 7 以降で使え、Android は 4.3 以降で受信、5.0 以降で送信に対応とあった。
 手元に Android 6.0 までアップデートした Nexus5 があったので、いろいろと試したのだが、どうもうまくいかない。
 
 さらに調べていくと、Android L の途中までは動いていたようなのだが、2014/10 の中頃のバージョンから動かなくなってしまったらしい。
 https://code.google.com/p/android-developer-preview/issues/detail?id=1570
 
 で、google の中の人から「Nexus 4/5/7 は、チップセットの問題でサポートしないよ」との書き込みもあった。Nexus って Android の公式マシンなのに ><
 https://code.google.com/p/android-developer-preview/issues/detail?id=1570#c52
 
 ログを最後の方まで調べていくと、Nexus 5 + Android 5.1.1 で動かすためのパッチを発見!!
 https://code.google.com/p/android-developer-preview/issues/detail?id=1570#c104
 
 ということで、ダメ元で試してみたら、advertising の送出に成功した。

 以下に、備忘録を兼ねて、メモを公開。