🚀

古のReact NativeプロジェクトでAndroid 14(targetSdkVersion 34)対応

2024/11/22に公開

困っている事

react-native@0.73.0 以上であればandroid/build.gradleでtargetSdkVersionを34に書き換えればひとまず済むのですが、それより古いReact Nativeを使っていると、ビルドは通ってもいざapkを端末に入れてアプリケーション起動しようとすると下記エラーと共にクラッシュします

One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts

手軽に0.73まで上げれるプロジェクトであれば上げてもらえば良いが、諸事情でそうも行かず0.61とかを使っているプロジェクトでは妥協案としてもっと簡易的に対応するのもアリ

参考

https://github.com/facebook/react-native/issues/41288

解決策

MainApplication.java に下記を追加

MainApplication.java
// ...省略
// 頭の方に
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import org.jetbrains.annotations.Nullable;
// ...省略

public class MainApplication extends Application implements ReactApplication {
  // ...省略
  // onCreateの下にでも
  @Override
  public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
    if (Build.VERSION.SDK_INT >= 34 && getApplicationInfo().targetSdkVersion >= 34) {
      return super.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
    } else {
      return super.registerReceiver(receiver, filter);
    }
  }
}

参考元のIssueで Context.RECEIVER_EXPORTED の部分で cannot find symbol で怒られてる人が何人か居るが、buildToolsVersion の上げ忘れが原因。

android/build.gradle
buildToolsVersion "34.0.0"

と、targetSdkVersionと同列に並べておきました

Discussion