Android 9 (Pie)でandroid.view.InflateException: Binary XML file lineが発生、Android8などでは動作するがPieでInflateExceptionエラー

リリースしたアプリがAndroid9でクラッシュしてしまうらしい。
手元にAndroid9(Pie)がないのでエミュレーターで確認すると、確かにMainActivityが起動できていない。
ログを見ると、android.view.InflateExceptionが発生していた。
Android8とかでは何機種試したけど、普通に動作するんだけどな。。


Process: com.doroidpanic.test, PID: 28843
    android.view.InflateException: Binary XML file line #28: Binary XML file line #28: Error inflating class TextView
    Caused by: android.view.InflateException: Binary XML file line #28: Error inflating class TextView
    Caused by: java.lang.NumberFormatException: For input string: "bold"

「java.lang.NumberFormatException: For input string: “bold”」???
ログに出てるXMLを追ってくと、確かにTextViewに行き着いて
そのTextViewにはtextFontWeightが指定してある。


android:textFontWeight="bold"

AndroidStudioが「Attribute textFontWeight is only used in API level 28 and higher r (current min is 21)」と言ってるけど、非推奨とかじゃないしな。。

この書き方も同じエラーで落ちる。


android:textStyle="bold"

adMobのリワード広告 – RewardedVideoAd.isLoadedでも真っ黒画面で広告がでない

事前にロードするリワードだと仕方がないかもしれないけど
admobの管理画面で表示と読込の乖離が気になってしまうので
すこしでもと、リワードを表示させるアクティビティを再描画する際、すでに広告を読み込んでいれば、loadAdしないようにしてみましたが、onResume後のチェックでisLoadedとなっても、.show()で真っ黒のリワードアクティビティがスタートしてしまった。。


@Override
protected void onResume() {
    if( rewardedVideoAd != null ) {
        rewardedVideoAd.resume( this );
    }
    super.onResume();
    loadRewardedVideoAd();
}

void loadRewardedVideoAd(){
    if( rewardedVideoAd.isLoaded() ){
        reward.setClickable( true );
        reward.setEnabled( true );
        // onResume後にここに入ってボタンで開始しても.show()で真っ黒
    }else{
        rewardedVideoAd.loadAd( getString( R.string.reword_ad_code ),
                new AdRequest.Builder().addTestDevice( getResources().getString( R.string.test_device_id ) ).build() );
    }
}

ログをみるとonRewardedVideoStartedは呼ばれているので
admobは表示されてるみたいですが、コンテンツが表示されない。。
onResume後はisLoaded()がtrueでも再度loadAdすればもちろん問題ないけど、どうなんだろう。。

firebase-core:16.0.6をアップデートしたらorg.gradle.api.resources.ResourceException: Could not get resourceが発生

firebase-coreをアップデートしたらorg.gradle.api.resources.ResourceException: Could not get resourceが発生


- implementation 'com.google.firebase:firebase-core:16.0.6'
+ implementation 'com.google.firebase:firebase-core:16.0.7'

‘https://maven.google.com/com/google/firebase/firebase-measurement-connector-impl/17.0.5/firebase-measurement-connector-impl-17.0.5-javadoc.jar’が空みたい。。
Chromeで試しにダウンロードしても「失敗 – ファイルがありません」となってしまう。
CDNの不調か何かで配信されてない?なんだろう。

ちょっと別件もあって時間ないので、16.0.7にする理由はないので、16.0.6で様子を見る。


Caused by: java.io.IOException: Response 204: No Content has no content!
	at org.gradle.internal.resource.transport.http.HttpResponseResource.openStream(HttpResponseResource.java:123)
	at org.gradle.internal.resource.transfer.ProgressLoggingExternalResourceAccessor$ProgressLoggingExternalResource.openStream(ProgressLoggingExternalResourceAccessor.java:62)
	at org.gradle.internal.resource.transfer.AccessorBackedExternalResource.withContentIfPresent(AccessorBackedExternalResource.java:135)
	... 140 more

org.gradle.api.resources.ResourceException: Could not get resource 'https://maven.google.com/com/google/firebase/firebase-measurement-connector-impl/17.0.5/firebase-measurement-connector-impl-17.0.5-javadoc.jar'.
	at org.gradle.internal.resource.ResourceExceptions.failure(ResourceExceptions.java:74)
	at org.gradle.internal.resource.ResourceExceptions.getFailed(ResourceExceptions.java:57)
	at org.gradle.internal.resource.transfer.AccessorBackedExternalResource.withContentIfPresent(AccessorBackedExternalResource.java:146)
	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$11.call(BuildOperationFiringExternalResourceDecorator.java:237)
	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$11.call(BuildOperationFiringExternalResourceDecorator.java:229)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:314)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:304)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:100)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator.withContentIfPresent(BuildOperationFiringExternalResourceDecorator.java:229)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.copyToCache(DefaultCacheAwareExternalResourceAccessor.java:199)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.access$300(DefaultCacheAwareExternalResourceAccessor.java:54)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:89)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:81)
	at org.gradle.cache.internal.ProducerGuard$AdaptiveProducerGuard.guardByKey(ProducerGuard.java:97)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.getResource(DefaultCacheAwareExternalResourceAccessor.java:81)
	at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceArtifactResolver.downloadByCoords(DefaultExternalResourceArtifactResolver.java:133)
	at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceArtifactResolver.downloadStaticResource(DefaultExternalResourceArtifactResolver.java:97)
	at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceArtifactResolver.resolveArtifact(DefaultExternalResourceArtifactResolver.java:66)
	at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver$RemoteRepositoryAccess.resolveArtifact(ExternalResourceResolver.java:477)
	at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$ResolveAndCacheRepositoryAccess.resolveArtifact(CachingModuleComponentRepository.java:424)
	at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveArtifact(ErrorHandlingModuleComponentRepository.java:183)
	at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainArtifactResolver.resolveArtifact(RepositoryChainArtifactResolver.java:81)
	at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingArtifactResolver.resolveArtifact(ErrorHandlingArtifactResolver.java:46)
	at org.gradle.api.internal.artifacts.query.DefaultArtifactResolutionQuery.addArtifacts(DefaultArtifactResolutionQuery.java:179)
	at org.gradle.api.internal.artifacts.query.DefaultArtifactResolutionQuery.buildComponentResult(DefaultArtifactResolutionQuery.java:168)
	at org.gradle.api.internal.artifacts.query.DefaultArtifactResolutionQuery.createResult(DefaultArtifactResolutionQuery.java:142)
	at org.gradle.api.internal.artifacts.query.DefaultArtifactResolutionQuery.execute(DefaultArtifactResolutionQuery.java:133)
	at com.android.build.gradle.internal.ide.dependencies.ArtifactDependencyGraph.handleSources(ArtifactDependencyGraph.java:351)
	at com.android.build.gradle.internal.ide.dependencies.ArtifactDependencyGraph.createDependencies(ArtifactDependencyGraph.java:309)
	at com.android.build.gradle.internal.ide.ModelBuilder.getDependencies(ModelBuilder.java:815)
	at com.android.build.gradle.internal.ide.ModelBuilder.createAndroidArtifact(ModelBuilder.java:919)
	at com.android.build.gradle.internal.ide.ModelBuilder.createVariant(ModelBuilder.java:583)
	at com.android.build.gradle.internal.ide.ModelBuilder.buildVariant(ModelBuilder.java:538)
	at com.android.build.gradle.internal.ide.ModelBuilder.buildAll(ModelBuilder.java:239)
	at com.android.build.gradle.internal.ide.ModelBuilder.buildAll(ModelBuilder.java:148)
	at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getParameterizedModel(DefaultBuildController.java:99)
	at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getModel(DefaultBuildController.java:81)
	at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter$2.getModel(InternalBuildActionAdapter.java:77)
	at org.gradle.tooling.internal.consumer.connection.BuildControllerAdapter.getModel(BuildControllerAdapter.java:62)
	at org.gradle.tooling.internal.consumer.connection.AbstractBuildController.findModel(AbstractBuildController.java:57)
	at com.android.tools.idea.gradle.project.sync.ng.SelectedVariantChooser.syncAndAddVariant(SelectedVariantChooser.java:148)
	at com.android.tools.idea.gradle.project.sync.ng.SelectedVariantChooser.selectVariantForAppOrLeaf(SelectedVariantChooser.java:129)
	at com.android.tools.idea.gradle.project.sync.ng.SelectedVariantChooser.chooseSelectedVariants(SelectedVariantChooser.java:79)
	at com.android.tools.idea.gradle.project.sync.ng.SyncProjectModels.populate(SyncProjectModels.java:92)
	at com.android.tools.idea.gradle.project.sync.ng.SyncAction.execute(SyncAction.java:59)
	at com.android.tools.idea.gradle.project.sync.ng.SyncAction.execute(SyncAction.java:33)
	at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:80)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedBuildActionRunner.buildResult(ClientProvidedBuildActionRunner.java:81)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedBuildActionRunner.access$100(ClientProvidedBuildActionRunner.java:38)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedBuildActionRunner$1.buildFinished(ClientProvidedBuildActionRunner.java:62)
	at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:370)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:352)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:340)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:327)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy15.buildFinished(Unknown Source)
	at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:165)
	at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:131)
	at org.gradle.internal.invocation.GradleBuildController$2.call(GradleBuildController.java:87)
	at org.gradle.internal.invocation.GradleBuildController$2.call(GradleBuildController.java:83)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
	at org.gradle.internal.invocation.GradleBuildController.configure(GradleBuildController.java:83)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedBuildActionRunner.run(ClientProvidedBuildActionRunner.java:70)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at 

more

tedivm/stash(phpキャッシュライブラリ)でPHP Fatal error: Uncaught Error: Call to protected method

ドキュメント通りにキャッシュディレクトリを指定するとprotected methodだよって怒られます。

https://packagist.org/packages/tedivm/stash


$driver 	= new Stash\Driver\FileSystem();
$driver->setOptions( [ 'path' => dirname(__FILE__) . '/cache/' ] );
$pool = new Stash\Pool( $driver );


PHP Fatal error:  Uncaught Error: Call to protected method Stash\Driver\FileSystem::setOptions() from context ''

コードを見てみると、setOptionsはprotectedに変更されています。


protected function setOptions(array $options = array())

なのでドライバーのインスタンス化の際に指定します。


$driver = new Stash\Driver\FileSystem( [ 'path' => dirname(__FILE__) . '/cache/' ] );
$pool = new Stash\Pool( $driver );

NodeJSでflvからmp4へのエンコード handbrake-jsインストールでエラー (public key is not available)

NodeJsでFlvからエンコードするケースがあったので、ffmpegではなくhandbreakでやってみようとnpmサイトをみながらインストール

handbrake-js
Handbrake-js is Handbrake (v1.1.2) for node.js, funnily enough. It aspires to provide a lean and stable foundation for building video transcoding software in node.js.

HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs. It can process most common multimedia files and any DVD or BluRay sources that do not contain any copy protection.

https://www.npmjs.com/package/handbrake-js


sudo add-apt-repository --yes ppa:stebbins/handbrake-releases
sudo apt-get update -qq
sudo apt-get install -qq handbrake-cli

The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 23E7166788B63E1E

レポジトリ追加でエラーが発生


Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/main Translation-en [183 kB]
Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [714 kB]
Get:19 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [6388 B]
Fetched 1900 kB in 4s (429 kB/s)
Reading package lists... Done
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://dl.yarnpkg.com/debian stable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 23E7166788B63E1E
W: Failed to fetch https://dl.yarnpkg.com/debian/dists/stable/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 23E7166788B63E1E

aptの証明書に設定


sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 23E7166788B63E1E
Executing: /tmp/apt-key-gpghome.pxI7v7yeEX/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 23E7166788B63E1E
gpg: key 1646B01B86E50310: "Yarn Packaging " 2 new signatures
gpg: key 1646B01B86E50310: "Yarn Packaging " 2 new subkeys

AdMobのリワード広告が出ない( onRewardedVideoAdLoaded Error Code = 3)

昨日まではテスト広告が表示されてたけど、今日はCode3になってしまう。

onRewardedVideoAdLoaded Code 3


     mRewardedVideoAd = MobileAds.getRewardedVideoAdInstance( this );
     mRewardedVideoAd.setRewardedVideoAdListener( this );
     loadRewarded();
   }

    private void loadRewarded() {
        if( !mRewardedVideoAd.isLoaded() ) {
            mRewardedVideoAd.loadAd( getString( R.string.ad_reword ),
                    new AdRequest.Builder().addTestDevice( getResources().getString( R.string.test_device_id ) ).build() );
        }
    }

    @Override
        public void onRewardedVideoAdFailedToLoad( int errorCode ) {

addTestDeviceでテストデバイスを指定してるけど
試しに、下記の方法でコードをアプリIDはそのままで、リワードのコードを変更したら表示されるようになった。

リワードはaddTestDeviceだけじゃだめなのか?

テストには必ずテスト広告を使用する
アプリの開発中やテストの際は必ずテスト広告を使用し、実際の広告は使用しないでください。実際の広告を使用すると、アカウントの停止につながる可能性があります。
テスト広告を読み込むには、次に示す Android 動画リワード向けのテスト専用広告ユニット ID を使う方法が便利です。
ca-app-pub-3940256099942544/5224354917

https://developers.google.com/admob/android/rewarded-video

AdMobのバナーが表示されない(Android,Java,Admob)

AdMobが表示されない時にみてみる。


adView.setAdListener( new AdListener() {
            @Override
            public void onAdLoaded() {
            }
            @Override
            public void onAdFailedToLoad(int errorCode) {
                Log.i( "trouble-adMob-isGone", "onAdFailedToLoad errorCode => " + errorCode );
            }

エラーコードはAdRequestに定義されています。


public static final int ERROR_CODE_INTERNAL_ERROR = 0;
public static final int ERROR_CODE_INVALID_REQUEST = 1;
public static final int ERROR_CODE_NETWORK_ERROR = 2;
public static final int ERROR_CODE_NO_FILL = 3;

onAdFailedToLoad() メソッドは、パラメータが含まれる唯一のメソッドです。errorCode パラメータは、発生したエラーの種類を表します。値は AdRequest クラスで定数値として定義されます。
ERROR_CODE_INTERNAL_ERROR - 内部でエラーが発生している(広告サーバーから無効な応答を受け取った場合など)。
ERROR_CODE_INVALID_REQUEST - 広告リクエストが無効(広告ユニット ID が不適切だった場合など)。
ERROR_CODE_NETWORK_ERROR - ネットワーク接続が原因で広告をリクエストできなかった。
ERROR_CODE_NO_FILL - 広告リクエストは成功したものの、広告枠の不足が原因で広告が返されなかった。

com.mikepenz:materialdrawerをアップデートしたらAndroidXが必要になって予定外のSupport LibraryからのandroidX移行

AndroidStudioのリファクタリングからAndroidXへのマイグレーションはできますが
失敗したのか、よくわかりませんが
自分の場合はimportとXmlは手動で変えました。
ほんとはどこまで自動やってくれるんだろう。。


< android.support.v4.view.ViewPager
 xmlns:android="http://schemas.android.com/apk/res/android"

< androidx.viewpager.widget.ViewPager
 xmlns:android="http://schemas.android.com/apk/res/android"

https://developer.android.com/jetpack/androidx/migrate

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