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
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
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
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?