react-native-sound: [Android + iOS] Build errors incompatible types: Double cannot be converted to Integer, etc.

  • Building and using react-native-sound was working fine on RN 0.53.0, and then it was not.
  • A brand new project with RN 0.53.3 builds fine.

Sorry I am stumped. Any suggestions are appreciated.

  • I have tried unlink and link.
  • Manually removing all traces of ‘sound’ from build files, react-native link react-native-sound
  • Comparing a new working project build settings to my existing project.
my-app/source/node_modules/react-native-sound/android/src/main/java/com/zmxv/RNSound/
RNSoundModule.java:43: error: cannot find symbol
    final ReactContext reactContext = this.context;
          ^
  symbol:   class ReactContext
  location: class RNSoundModule
my-app/source/node_modules/react-native-sound/android/src/main/java/com/zmxv/RNSound/
RNSoundModule.java:207: error: incompatible types: Double cannot be converted to Integer
      setOnPlay(false, key);
                       ^
my-app/source/node_modules/react-native-sound/android/src/main/java/com/zmxv/RNSound/
RNSoundModule.java:223: error: incompatible types: Double cannot be converted to Integer
      this.focusedPlayerKey = key;
````                              ^
my-app/source/node_modules/react-native-sound/android/src/main/java/com/zmxv/RNSound/
RNSoundModule.java:260: error: incompatible types: Double cannot be converted to Integer
    setOnPlay(true, key);
                    ^
my-app/source/node_modules/react-native-sound/android/src/main/java/com/zmxv/RNSound/
RNSoundModule.java:284: error: incomparable types: Double and Integer
    if (!this.mixWithOthers && key == this.focusedPlayerKey) {
                                   ^
my-app/source/node_modules/react-native-sound/android/src/main/java/com/zmxv/RNSound/
RNSoundModule.java:416: error: incompatible types: Integer cannot be converted to Double
              this.pause(this.focusedPlayerKey, null);

app/build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"    

    updateVersionInfoJs()

    android {
    dexOptions {
        javaMaxHeapSize "4g"
    }

    defaultConfig {
        applicationId "com.ditchwitch.fieldscout"
        minSdkVersion 16
        multiDexEnabled true
        targetSdkVersion 22
        versionCode getBuildNumber()
        versionName getVersionString()
        setProperty("archivesBaseName", "field-scout-android-$versionName")        
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
	"react": "^16.2.0",
	"react-native": "^0.53.3",
	"react-native-sound": "^0.10.4",

iOS Build Errors:

my-app/source/node_modules/react-native-sound/RNSound/RNSound.h:11:1: error: missing '@end'
@interface RNSound : NSObject <RCTBridgeModule, AVAudioPlayerDelegate>
^
my-app/source/node_modules/react-native-sound/RNSound/RNSound.h:10:1: note: class started here
@interface RNSound : RCTEventEmitter <RCTBridgeModule, AVAudioPlayerDelegate>
^
my-app/source/node_modules/react-native-sound/RNSound/RNSound.h:11:20: error: expected identifier or '('
@interface RNSound : NSObject <RCTBridgeModule, AVAudioPlayerDelegate>
                   ^
my-app/source/node_modules/react-native-sound/RNSound/RNSound.m:14:13: error: property implementation must
      have its declaration in interface 'RNSound' or one of its extensions
@synthesize _key = _key;
            ^
my-app/source/node_modules/react-native-sound/RNSound/RNSound.m:20:53: error: property '_key' not found on
      object of type 'RNSound *'
    AVAudioPlayer* player = [self playerForKey:self._key];
                                                    ^
my-app/source/node_modules/react-native-sound/RNSound/RNSound.m:221:8: error: property '_key' not found on
      object of type 'RNSound *'
  self._key = key;

Thank you for sharing your work and react-native-sound !

Thanks in advance for any tips or suggestions.

About this issue

  • Original URL
  • State: open
  • Created 6 years ago
  • Reactions: 2
  • Comments: 19

Commits related to this issue

Most upvoted comments

for all who are having this problem, go to node_modules\react-native-sound\android\src\main\java\com\zmxv\RNSound\RNSoundModule.java and replace all the file contents with following code-

package com.zmxv.RNSound;

import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.net.Uri; import android.media.AudioManager;

import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.ExceptionsManagerModule;

import java.io.File; import java.util.HashMap; import java.util.Map; import java.io.IOException; import android.util.Log; public class RNSoundModule extends ReactContextBaseJavaModule { Map<Integer, MediaPlayer> playerPool = new HashMap<>(); ReactApplicationContext context; final static Object NULL = null; public RNSoundModule(ReactApplicationContext context) { super(context); this.context = context; } @Override public String getName() { return “RNSound”; } @ReactMethod public void prepare(final String fileName, final Integer key, final ReadableMap options, final Callback callback) { MediaPlayer player = createMediaPlayer(fileName); if (player == null) { WritableMap e = Arguments.createMap(); e.putInt(“code”, -1); e.putString(“message”, “resource not found”); return; } final RNSoundModule module = this; player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { boolean callbackWasCalled = false; @Override public synchronized void onPrepared(MediaPlayer mp) { if (callbackWasCalled) return; callbackWasCalled = true; module.playerPool.put(key, mp); WritableMap props = Arguments.createMap(); props.putDouble(“duration”, mp.getDuration() * .001); try { callback.invoke(NULL, props); } catch(RuntimeException runtimeException) { // The callback was already invoked Log.e(“RNSoundModule”, “Exception”, runtimeException); } } }); player.setOnErrorListener(new OnErrorListener() { boolean callbackWasCalled = false; @Override public synchronized boolean onError(MediaPlayer mp, int what, int extra) { if (callbackWasCalled) return true; callbackWasCalled = true; try { WritableMap props = Arguments.createMap(); props.putInt(“what”, what); props.putInt(“extra”, extra); callback.invoke(props, NULL); } catch(RuntimeException runtimeException) { // The callback was already invoked Log.e(“RNSoundModule”, “Exception”, runtimeException); } return true; } }); try { player.prepareAsync(); } catch (IllegalStateException ignored) { // When loading files from a file, we useMediaPlayer.create, which actually // prepares the audio for us already. So we catch and ignore this error } } protected MediaPlayer createMediaPlayer(final String fileName) { int res = this.context.getResources().getIdentifier(fileName, “raw”, this.context.getPackageName()); if (res != 0) { return MediaPlayer.create(this.context, res); } if(fileName.startsWith(“http://”) || fileName.startsWith(“https://”)) { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); Log.i(“RNSoundModule”, fileName); try { mediaPlayer.setDataSource(fileName); } catch(IOException e) { Log.e(“RNSoundModule”, “Exception”, e); return null; } return mediaPlayer; } File file = new File(fileName); if (file.exists()) { Uri uri = Uri.fromFile(file); // Mediaplayer is already prepared here. return MediaPlayer.create(this.context, uri); } return null; } @ReactMethod public void play(final Integer key, final Callback callback) { MediaPlayer player = this.playerPool.get(key); if (player == null) { callback.invoke(false); return; } if (player.isPlaying()) { return; } player.setOnCompletionListener(new OnCompletionListener() { boolean callbackWasCalled = false; @Override public synchronized void onCompletion(MediaPlayer mp) { if (!mp.isLooping()) { if (callbackWasCalled) return; callbackWasCalled = true; try { callback.invoke(true); } catch (Exception e) { //Catches the exception: java.lang.RuntimeException·Illegal callback invocation from native module } } } }); player.setOnErrorListener(new OnErrorListener() { boolean callbackWasCalled = false; @Override public synchronized boolean onError(MediaPlayer mp, int what, int extra) { if (callbackWasCalled) return true; callbackWasCalled = true; callback.invoke(false); return true; } }); player.start(); } @ReactMethod public void pause(final Integer key, final Callback callback) { MediaPlayer player = this.playerPool.get(key); if (player != null && player.isPlaying()) { player.pause(); } callback.invoke(); } @ReactMethod public void stop(final Integer key, final Callback callback) { MediaPlayer player = this.playerPool.get(key); if (player != null && player.isPlaying()) { player.pause(); player.seekTo(0); } callback.invoke(); } @ReactMethod public void release(final Integer key) { MediaPlayer player = this.playerPool.get(key); if (player != null) { player.release(); this.playerPool.remove(key); } } @ReactMethod public void setVolume(final Integer key, final Float left, final Float right) { MediaPlayer player = this.playerPool.get(key); if (player != null) { player.setVolume(left, right); } } @ReactMethod public void setLooping(final Integer key, final Boolean looping) { MediaPlayer player = this.playerPool.get(key); if (player != null) { player.setLooping(looping); } } @ReactMethod public void setSpeed(final Integer key, final Float speed) { MediaPlayer player = this.playerPool.get(key); if (player != null) { player.setPlaybackParams(player.getPlaybackParams().setSpeed(speed)); } } @ReactMethod public void setCurrentTime(final Integer key, final Float sec) { MediaPlayer player = this.playerPool.get(key); if (player != null) { player.seekTo((int)Math.round(sec * 1000)); } } @ReactMethod public void getCurrentTime(final Integer key, final Callback callback) { MediaPlayer player = this.playerPool.get(key); if (player == null) { callback.invoke(-1, false); return; } callback.invoke(player.getCurrentPosition() * .001, player.isPlaying()); } //turn speaker on @ReactMethod public void setSpeakerphoneOn(final Integer key, final Boolean speaker) { MediaPlayer player = this.playerPool.get(key); if (player != null) { player.setAudioStreamType(AudioManager.STREAM_MUSIC); AudioManager audioManager = (AudioManager)this.context.getSystemService(this.context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); audioManager.setSpeakerphoneOn(speaker); } } @ReactMethod public void enable(final Boolean enabled) { // no op } @Override public Map<String, Object> getConstants() { final Map<String, Object> constants = new HashMap<>(); constants.put(“IsAndroid”, true); return constants; } }

@trepidity just tried 0.10.7 . iOS is okay, android still throws errors

RNSoundModule.java:207: error: incompatible types: Double cannot be converted to Integer setOnPlay(false, key);
RNSoundModule.java:223: error: incompatible types: Double cannot be converted to Integer this.focusedPlayerKey = key;
RNSoundModule.java:232: error: incompatible types: Double cannot be converted to Integer setOnPlay(false, key);
RNSoundModule.java:248: error: incompatible types: Double cannot be converted to Integer setOnPlay(false, key);
RNSoundModule.java:260: error: incompatible types: Double cannot be converted to Integer setOnPlay(true, key);
RNSoundModule.java:284: error: incomparable types: Double and Integer if (!this.mixWithOthers && key == this.focusedPlayerKey) {
RNSoundModule.java:308: error: incomparable types: Double and Integer if (!this.mixWithOthers && key == this.focusedPlayerKey) {
RNSoundModule.java:416: error: incompatible types: Integer cannot be converted to Double this.pause(this.focusedPlayerKey, null);
RNSoundModule.java:420: error: incompatible types: Integer cannot be converted to Double this.play(this.focusedPlayerKey, null);

RN version 0.53.3

Master and unstable have been updated. version 0.10.7 has been published. This should no longer be an issue.

@trepidity Same compile errors after yarn add to version 0.10.6

	"react-native-sound": "^0.10.6",

: error: cannot find symbol
    final ReactContext reactContext = this.context;

7: error: incompatible types: Double cannot be converted to Integer
      setOnPlay(false, key);

I still do not understand why creating a new project from scratch, adding react-native-sound, and adding an import to react-native-sound to App.js file, then call a Sound.method() or two, and yet is has no compile errors?

How does yarn add react-native-sound know to get latest package from the web or it’s cache?

Does yarn use package version numbers?

Or does it use a hash or something?