Android

Android Oでフォアグラウンドサービスがjava.lang.RuntimeException [Caused by: java.lang.SecurityExceptio at android.app.Service.startForeground]

Playコンソールでエラーを見つけた・・


java.lang.RuntimeException: 
  at android.app.ActivityThread.handleServiceArgs (ActivityThread.java:3698)
  at android.app.ActivityThread.access$1600 (ActivityThread.java:200)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1691)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:193)
  at android.app.ActivityThread.main (ActivityThread.java:6762)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)
Caused by: java.lang.SecurityException: 
  at android.os.Parcel.createException (Parcel.java:1950)
  at android.os.Parcel.readException (Parcel.java:1918)
  at android.os.Parcel.readException (Parcel.java:1868)
  at android.app.IActivityManager$Stub$Proxy.setServiceForeground (IActivityManager.java:5198)
  at android.app.Service.startForeground (Service.java:695)
  at com.doroidpanic.apps.service.xxyba.a (Xxyba.java:150)
  at com.doroidpanic.apps.service.xxyba.onStartCommand (Xxyba.java:102)
  at android.app.ActivityThread.handleServiceArgs (ActivityThread.java:3679)
Caused by: android.os.RemoteException: 
  at com.android.server.am.ActivityManagerService.enforcePermission (ActivityManagerService.java:9331)
  at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked (ActiveServices.java:1193)
  at com.android.server.am.ActiveServices.setServiceForegroundLocked (ActiveServices.java:874)
  at com.android.server.am.ActivityManagerService.setServiceForeground (ActivityManagerService.java:20597)
  at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:976)

ここにあった。
https://developer.android.com/about/versions/pie/android-9.0-changes-28#fg-svc

パーミッションが足りてないのか


< uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

動作の変更点: API レベル 28+ をターゲットとするアプリ
Android 9(API レベル 28)では、Android システムにさまざまな変更が加えられています。 以下の動作の変更点は、API レベル 28 以降をターゲットとするアプリのみに適用されます。 targetSdkVersion を API レベル 28 以降に設定するアプリは、必要に応じてアプリを修正してこれらの動作を適切にサポートする必要があります。
Android 9 で実行されるすべてのアプリに影響を与える変更点については、ターゲットとする API レベルに関係なく、動作の変更点: すべてのアプリをご覧ください。
フォアグラウンド サービス
Android 9 以降をターゲットにするアプリは、フォアグラウンド サービスを使用する際に FOREGROUND_SERVICE パーミッションをリクエストする必要があります。 これは Normal パーミッションなので、リクエストしたアプリに自動で付与されます。

Android 9 以降をターゲットにするアプリが FOREGROUND_SERVICE をリクエストせずに、フォアグラウンド サービスの作成を試みると、システムにより、SecurityException がスローされます。

AndroidStudioからGitHubにリモートプッシュしたら [Push rejected: Push master to origin/master was rejected by remote] [remote: error: GH007: Your push would publish a private email address.]

既存のプロジェクトをAndroidStudioからGitHubにインポートはできましたが
ローカルのcommitをリモートへPushしようとしたらエラーが発生

Push rejected: Push master to origin/master was rejected by remote


Push rejected: Push master to origin/master was rejected by remote

ネットで調べて、pull origin masterしたけどダメだったので
プロジェクトディレクトリでターミナル開いてターミナルからGitコマンドを実行したら詳細なエラーがわかりました。

GH007: Your push would publish a private email address.


$git push origin master
Enumerating objects: 38, done.
Counting objects: 100% (38/38), done.
Delta compression using up to 8 threads
Compressing objects: 100% (16/16), done.
Writing objects: 100% (20/20), 2.37 KiB | 809.00 KiB/s, done.
Total 20 (delta 11), reused 0 (delta 0)
remote: Resolving deltas: 100% (11/11), completed with 11 local objects.
remote: error: GH007: Your push would publish a private email address.
remote: You can make your email public or disable this protection by visiting:
remote: http://github.com/settings/emails
To https://github.com/doroidpanic/test.git
 ! [remote rejected] master -> master (push declined due to email privacy restrictions)
error: failed to push some refs to 'https://github.com/doroidpanic/test.git'

GitHubのエラーコードGH007でした
Githubのアカウント設定で「Keep my email address private」なのに
そのメールアドレスが設定されているので止めてくれていたようです。

Commitに残るアドレスは


git config --global user.email

で確認できます。

GitHubにログインしてのメールアドレス設定のページにアクセスすると
「Primary email address」のところに自分の匿名?”@users.noreply.github.com”のメールアドレスが記載されています。
フォントの関係で見えにくいですが、説明文の中に@users.noreply.github.comがあります。

それをGitに設定しました。


 git config --global user.email  "@users.noreply.github.com"

ローカルコミットの取り消し


git reset --soft HEAD^

ターミナルでHeadしたら、AndroidStudio側の履歴も即反映されたので
もう一度コミットして詳細をみると、メールアドレスが@users.noreply.github.comになっています。
それから再度リモートプッシュしたら成功しました。


プッシュ成功: Pushed 1 commit to origin/master

https://github.com/settings/emails

Cordova run が固まる Freeze on executing ‘cordova run’


Cordova run

がうんともすんとも言わなくなった。。
そんなときは「–verbose」をつけて確認してみる。


#cordova run  --verbose
  copy  www/node_modules/material-design-icons/image/2x_web/ic_filter_6_black_24dp.png platforms/android/assets/www/node_modules/material-design-icons/image/2x_web/ic_filter_6_black_24dp.png (new file)
  copy  www/node_modules/material-design-icons/image/2x_web/ic_filter_6_black_36dp.png platforms/android/assets/www/node_modules/material-design-icons/image/2x_web/ic_filter_6_black_36dp.png (new file)
  copy  www/node_modules/material-design-icons/image/2x_web/ic_filter_6_black_48dp.png platforms/android/assets/www/node_modules/material-design-icons/image/2x_web/ic_filter_6_black_48dp.png (new file)
  copy  www/node_modules/material-design-icons/image/2x_web/ic_filter_6_white_18dp.png platforms/android/assets/www/node_modules/material-design-icons/image/2x_web/ic_filter_6_white_18dp.png (new file)
  copy  www/node_modules/material-design-icons/image/2x_web/ic_filter_6_white_24dp.png platforms/android/assets/www/node_modules/material-design-icons/image/2x_web/ic_filter_6_white_24dp.png (new file)

ディレクトリ間違えててwwwディレクトリにアイコンセットをnpm installしてたみたいです。。
大量のコピーが走って固まってるように見えてただけでした。

Cordovaでweb3.jsを使ってkeyStoreの生成を行なうと処理が重くてUIが固まったのでミリ秒で測ってみた。

Cordovaでweb3.jsを使ってアカウント生成から、keyStoreの生成まで行なうと処理が重くてUIが固まったのでミリ秒で測ってみた。


self.prevPointTime = null;
self.log      = [];
self.bench    = function( message , obj ){
console.log( message , obj );
  if( !self.prevPointTime ){
   self.prevPointTime = new Date();
   }
  self.log.push( { message : message , time: ( new Date().getTime() )  - self.prevPointTime.getTime() } );
   self.prevPointTime = new Date();
}

//アカウント生成
self.bench( "web3 -> start create" , null );
var account = self.web3.eth.accounts.create();
self.bench( "web3 -> end create" , account );

//キーストア生成
self.bench( "web3 -> start encrypt" , null );
var key = self.web3.eth.accounts.encrypt( account.privateKey , password );
self.bench( "web3 -> end encrypt" , key );

console.log( self.log );
1: {message: "web3 -> start create", time: 0}
2: {message: "web3 -> end create", time: 51}
3: {message: "web3 -> start encrypt", time: 0}
4: {message: "web3 -> end encrypt", time: 1829}  < -- 1800ミリ秒は重いな。。

ChromeでもCordovaでも差はなくただただencryptが重い。
setTimeoutにしても結局シングルスレッドだし、keyStore形式の必要はないので
encryptの部分を別の暗号化にしてみる。

Cordova Android Runtime Permission Plugin – cordova-plugin-android-permissionsでパーミッション要求が行われない。 requestPermission is not work

cordova-plugin-android-permissions


permissions.requestPermission(successCallback, errorCallback, permission);

ステップ実行で確認すると、hasPermissionではstatus.hasPermissioがFALSEになっているのですが
、デバック実行しても、パーミション要求が動かないことがありました。

原因はpluginの入れ替えで、要求するパーミンションがAndroidManifest.xmlから消えていたのが原因でした、Manifestに無いパーミッションはリクエストしても要求画面は開きません。

cordova-plugin-cameraを入れ直した際に、Manifestからcameraが消えており、要求が失敗していました。

cocos2dxのcreate_project.pyでエラー

cocos2dxをwindows7環境でセットアップしましたが、tools\project-creatorのcreate_project.pyでエラーが出てしまいました。


[code language=”bash”]
C:\Program Files\cocos2dx\tools\project-creator>create_project.py -project Cocos
2dxtest -package com.doroidpanic.Cocos2dx-test -language cpp
File "create_project.py", line 27
print "Usage: create_project.py -project PROJECT_NAME -package PACKAGE_NAME
-language PROGRAMING_LANGUAGE"

^
SyntaxError: invalid syntax

C:\Program Files\cocos2dx\tools\project-creator>
[/code]


サンプルどおりのつもりでしたが、エラー。。
調べてみるとcreate_project.pyってpython2で書かれているらしい。。
AndroidNDKのバージョンには注意(Revision 8eをインストールする!)していましたが、pythonはうっかりpython3を入れていました。
python3を一旦アンインストールして、python2.7をインストールしたらあっさりクリア


[code language=”bash”]
C:\Program Files\cocos2dx\tools\project-creator>create_project.py -project Cocos
2dxtest -package com.doroidpanic.Cocos2dx-test -language cpp
proj.ios : Done!
proj.android : Done!
proj.win32 : Done!
proj.winrt : Done!
proj.wp8 : Done!
proj.mac : Done!
proj.blackberry : Done!
proj.linux : Done!
proj.marmalade : Done!
New project has been created in this path: C:\Program Files\cocos2dx\tools\proje
ct-creator/../../projects/Cocos2dxtest
Have Fun!

C:\Program Files\cocos2dx\tools\project-creator>
[/code]

Androidアプリ「SPモードメールGmailバックアップ」のリリース・使い方や設定方法

SPモードメールGmailバックアップはSPモードメールのメールをGmailにバックアップするための無料アプリです。

SPモードメールはドコモのメールアプリですが、アップデートでメールが消えてしまったり、保存量が増えるとSPモードメールアプリの動作が重く、遅くなったりと動作がいまいちです。


当アプリ「SPモードメールGmailバックアップ」を使えば大切なメールををAndroidスマートフォンからGmailへメールを保存することができます。
Gmailに保存すればGmailアプリからメールを見ることができ、クラウドにメールが保存されるのでスマートフォンが故障してもメールが消えることはありません。

目次

  • バックアップの事前設定
  • SPモードメールGmailバックアップ操作方法
  • バックアップがエラー・うまく動かない
  • アカウント情報の取扱い

アプリで出来ること・確認できたこと

  • SPモードメールをGmailにバックアップ
  • HTMLメールのバックアップ(zozoタウンのメールで確認)
  • 送信者・受信者・受信時間をGmailに反映

アプリで出来ないこと・準備中

  • 絵文字をGmailで見たときに表示
  • HTML形式のメールもうまく表示できないケースがあるかもしれません。
  • 同じemlをバックアップした場合、重複して登録されてしまいます。

アプリ利用の注意

複数の機種で動作確認を行いましたが、すべてのメール、スマートフォンで動作が確認できていません。

大事なメールデータを守るためにも、バックアップ後のSPモードメールの削除を行う前にバックアップが正常に終了したことを必ずご確認ください。

SPモードメールバックアップの不具合・要望お問合せフォーム

バックアップの事前設定

01.Gmailの設定

アプリからGmailに転送するため、Gmail側でIMAPを有効にする必要があります。

Gmailにログインして、画面右上の歯車のメニューから「設定」を選択して、「メール転送と POP/IMAP」のタブを選択してください。
「メール転送と POP/IMAP」の下部にある「IMAP アクセス:」を「IMAP を有効にする」に設定してください。


02.SPモードメールのバックアップ

SPモードメールアプリからGmailにバックアップしたいメールをエクスポートします。

エクスポートは「eml」形式で行ってください。

エクスポートしただけではSPモードメールが消えることはありません。



03.emlファイルをSDにエクスポート

外部ストレージにメールをコピーしてください。
保存場所は「外部ストレージ/private/docomo/mail/export」へ保存してください。

デフォルトで「外部ストレージ/private/docomo/mail/export」だと思いますが、違う場合は作者までご連絡ください。





SPモードメールのエクスポートが完了したら、次は「SPモードメールバックアップ」を使ってGmailへ転送します。

SPモードメールGmailバックアップ操作方法

01.Googleアカウントの選択

アプリを起動すると自動でスマートフォンに登録されているGoogleのアカウントを取得します。

アプリの「アカウントを選択」をタップしてバックアップ先となるGmail(google)アカウントを選択してください。



01.Googleのログイン情報を設定

Gmail(google)アカウントのパスワードを入力して下さい。



3.Gmailのラベルを設定

Gmailはメールにラベルをつけて、フォルダ別けを行うことができます。
このアプリは設定したラベルにSpモードメールのバックアップを転送します、設定したラベルは自動で作成されます。
デフォルトは「spmail」です、変更しなくても動作に問題はありません。

4.自動削除

自動削除はSDカード(内部ストレージの機種もあり)にSPモードメールアプリからエクスポートしたemlファイルをバックアップ後に削除するかどうかの設定です。
※emlファイルの削除はご自身の環境でバックアップが正常に完了することを確認の上ご利用ください。


5.バックアップの確認

「バックアップ開始」をタップすると、ポップアップが表示されます。
内容を確認して、設定に間違えがなければ「実行」をタップしてください。



6.バックアップの結果・途中確認

スマートフォンのステータスバー(通知領域)にエラーやバックアップの進捗が表示されます。



7.バックアップしたSPモードメールの確認

バックアップが完了したら、Gmailを確認してください。
ラベルが作成されて、その中にSPモードメールがバックアップされています。


SPモードメールバックアップの不具合・要望お問合せフォーム

SPモードメールのメール削除について

当アプリ「SPモードメールGmailバックアップ」でバックアップを行っても、SPモードメールのメールを直接削除することはありません。
当アプリで削除することができるのは、SDカードなどの外部ストレージにエクスポートしたemlファイルです。

容量確保や動作を軽くする為には、バックアップが問題なく終わったことを確認した後、手動でSPモードメールから削除していただく必要があります。

SPモードメールのバックアップがエラー・うまく動かない

エラーになってしまったり、バックアップがうまく動かない場合は下記を確認してください。


※アカウント情報の取扱いについて

当アプリはGmailへ転送するためにGoogleアカウントを取得したり、パスワード入力を求めますが、これらのアカウント情報、SPモードメールの情報を含めてアプリ利用者の情報はGmailとの通信以外で利用いたしません。

Google Chart Toolsでエラー『Cannot set property ‘overflow’ of null』

Google Chart Toolsを利用してスマートフォン用のページに棒グラフを表示しており
Nexusで動作チェックをしてたので気づきませんでしたが、
XperiaAcroやGalaxySなどのちょっと前の機種で

Cannot set property ‘overflow’ of null

と表示されてグラフが表示できませんでした。
DOMを読み込むタイミング?ブラウザ?の問題なのか分かりませんでした。
とりあえず、Androidバージョンで別のソースにして逃げます。