2016-07-30 3 views
3

JavaFx Media는 아직 모바일 플랫폼으로 이식되지 않았으므로 누구나 기본 iOS APi를 사용하여 내 주/리소스 폴더에 저장할 사운드 mp3 파일을 재생할 수 있습니다. 글루온 프로젝트.Gluon Mobile iOS 오디오 플레이어

답변

3

Android에서 Gluon 프로젝트의 Android 폴더에 기본 API를 쉽게 추가 할 수 있지만 (Android에서는 Native Media 사용에 대해서는 solution을 확인하십시오.) iOS 폴더에서 Media API와 함께 원시 코드 (Objetive-C)를 사용합니다 충분하지 않습니다. 컴파일해야하기 때문에 컴파일 된 파일을 ipa에 포함시켜야합니다.

현재 Charm Down은 많은 서비스를 제공하고 있습니다. iOS에 대한 build.gradle 스크립트를 살펴보면 libCharm.a을 컴파일하고 빌드하는 xcodebuild 태스크가 포함되어 있습니다.이 태스크는 나중에 해당 서비스를 사용하는 iOS 프로젝트에 포함되어야합니다.

나의 제안은 매력 아래를 복제하고, 새로운 서비스를 제공 할 것 같은 몇 가지 기본적인 방법으로, AudioService :

public interface AudioService { 
    void play(String audioName); 
    void pause(); 
    void resume(); 
    void stop(); 
} 
이 서비스는 Platform 클래스에 추가됩니다

:

public abstract class Platform { 
    ... 
    public abstract AudioService getAudioService(); 
} 

데스크톱 (비어 있음), Android (예 : here) 및 iOS에 대한 구현을 제공해야합니다.

IOS 구현 - 자바

당신은 IOSPlatform 클래스에이를 추가해야합니다

:

public class IOSPlatform extends Platform { 
    ... 
    @Override 
    public AudioService getAudioService() { 
     if (audioService == null) { 
      audioService = new IOSAudioService(); 
     } 
     return audioService; 
    } 
} 

IOSAudioService 클래스 생성 : 마지막으로

public class IOSAudioService implements AudioService { 

    @Override 
    public void play(String audioName) { 
     CharmApplication.play(audioName); 
    } 

    @Override 
    public void pause() { 
     CharmApplication.pause(); 
    } 

    @Override 
    public void resume() { 
     CharmApplication.resume(); 
    } 

    @Override 
    public void stop() { 
     CharmApplication.stop(); 
    } 
} 

을, 당신은 할 것 CharmApplication에 기본 전화를 추가하는 방법 :

public class CharmApplication { 
    static { 
     System.loadLibrary("Charm"); 
     _initIDs(); 
    } 
    ... 
    public static native void play(String audioName); 
    public static native void pause(); 
    public static native void resume(); 
    public static native void stop(); 
} 

IOS 구현 - 이제 목표 - C

, 기본 폴더에 CharmApplication.m에, 그 통화의 구현 추가

#include "CharmApplication.h" 
... 
#include "Audio.h" 

// Audio 
Audio *_audio; 

JNIEXPORT void JNICALL Java_com_gluonhq_charm_down_ios_CharmApplication_play 
(JNIEnv *env, jclass jClass, jstring jTitle) 
{ 
    NSLog(@"Play audio"); 
    const jchar *charsTitle = (*env)->GetStringChars(env, jTitle, NULL); 
    NSString *name = [NSString stringWithCharacters:(UniChar *)charsTitle length:(*env)->GetStringLength(env, jTitle)]; 
    (*env)->ReleaseStringChars(env, jTitle, charsTitle); 

    _audio = [[Audio alloc] init]; 
    [_audio playAudio:name]; 
    return; 
} 

JNIEXPORT void JNICALL Java_com_gluonhq_charm_down_ios_CharmApplication_pause 
(JNIEnv *env, jclass jClass) 
{ 
    if (_audio) 
    { 
     [_audio pauseAudio]; 
    } 
    return; 
} 

JNIEXPORT void JNICALL Java_com_gluonhq_charm_down_ios_CharmApplication_resume 
(JNIEnv *env, jclass jClass) 
{ 
    if (_audio) 
    { 
     [_audio resumeAudio]; 
    } 
    return; 
} 

JNIEXPORT void JNICALL Java_com_gluonhq_charm_down_ios_CharmApplication_stop 
(JNIEnv *env, jclass jClass) 
{ 
    if (_audio) 
    { 
     [_audio stopAudio]; 
    } 
    return; 
} 

및 헤더 파일 Audio.h을 만듭니다

#import <AVFoundation/AVFoundation.h> 
#import <UIKit/UIKit.h> 

@interface Audio :UIViewController <AVAudioPlayerDelegate> 
{ 
} 
    - (void) playAudio: (NSString *) audioName; 
    - (void) pauseAudio; 
    - (void) resumeAudio; 
    - (void) stopAudio; 
@end 

조정 Audio.m.이 일이 tutorial을 기반으로합니다

#include "Audio.h" 
#include "CharmApplication.h" 

@implementation Audio 

AVAudioPlayer* player; 

- (void)playAudio:(NSString *) audioName 
{ 
    NSString* fileName = [audioName stringByDeletingPathExtension]; 
    NSString* extension = [audioName pathExtension]; 

    NSURL* url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@",fileName] withExtension:[NSString stringWithFormat:@"%@",extension]]; 
    NSError* error = nil; 

    if(player) 
    { 
     [player stop]; 
     player = nil; 
    } 

    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
    if(!player) 
    { 
     NSLog(@"Error creating player: %@", error); 
     return; 
    } 
    player.delegate = self; 
    [player prepareToPlay]; 
    [player play]; 

} 

- (void)pauseAudio 
{ 
    if(!player) 
    { 
     return; 
    } 
    [player pause]; 
} 

- (void)resumeAudio 
{ 
    if(!player) 
    { 
     return; 
    } 
    [player play]; 
} 

- (void)stopAudio 
{ 
    if(!player) 
    { 
     return; 
    } 
    [player stop]; 
    player = nil; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    NSLog(@"%s successfully=%@", __PRETTY_FUNCTION__, flag ? @"YES" : @"NO"); 
} 

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error 
{ 
    NSLog(@"%s error=%@", __PRETTY_FUNCTION__, error); 
} 

@end 

네이티브 라이브러리

편집 아이폰 OS 모듈의 build.gradle을 구축하고 xcodebuild 작업에 오디오 서비스를 추가 :

def nativeSources = ["$project.projectDir/src/main/native/CharmApplication.m", 
        ..., 
        "$project.projectDir/src/main/native/Audio.m"] 

... 
def compileOutputs = [ 
       "$project.buildDir/native/$arch/CharmApplication.o", 
       "$project.buildDir/native/$arch/Charm.o", 
       ..., 
       "$project.buildDir/native/$arch/Audio.o"] 

프로젝트 빌드

프로젝트를 저장하고 명령 줄 실행에 매력 다운 프로젝트의 루트에서 :

./gradlew clean build 

모든 것이 잘 경우

, 당신은이 있어야합니다

  • 일반/건설/libs와/charm- 다운 공통 2.1.0-SNAPSHOT.jar
  • 데스크탑/빌드/libs와/매력 다운 데스크톱-2.1.0-SNAPSHOT.jar
  • 안드로이드/빌드/libs와/매력 다운 - 안드로이드 2.1. 0-SNAPSHOT.jar
  • IOS/build/libs/charm-down-ios-2.1.0-S NAPSHOT.jar
  • IOS/빌드/기본/libCharm.a

글루온 프로젝트 그 종속성 및 네이티브 라이브러리, 새 글루온 프로젝트를 만들 수 및 추가 뜻

jars는 로컬 종속성으로 (libs 폴더로).

네이티브 라이브러리의 경우이 경로에 추가해야합니다 (src/ios/jniLibs/libCharm.a).

업데이트 build.gradle 스크립트

보기에
repositories { 
    flatDir { 
     dirs 'libs' 
    } 
    jcenter() 
    ... 
} 

dependencies { 
    compile 'com.gluonhq:charm-glisten:3.0.0' 
    compile 'com.gluonhq:charm-down-common:2.1.0-SNAPSHOT' 
    compile 'com.gluonhq:charm-glisten-connect-view:3.0.0' 

    iosRuntime 'com.gluonhq:charm-glisten-ios:3.0.0' 
    iosRuntime 'com.gluonhq:charm-down-ios:2.1.0-SNAPSHOT' 
} 

, 서비스를 검색하고 play("audio.mp3"), pause(), resume()stop() 방법 호출 할 몇 가지 기본적인 UI를 제공합니다 마지막으로

private boolean pause; 

public BasicView(String name) { 
    super(name); 

    AudioService audioService = PlatformFactory.getPlatform().getAudioService(); 
    final HBox hBox = new HBox(10, 
      MaterialDesignIcon.PLAY_ARROW.button(e -> audioService.play("audio.mp3")), 
      MaterialDesignIcon.PAUSE.button(e -> { 
       if (!pause) { 
        audioService.pause(); 
        pause = true; 
       } else { 
        audioService.resume(); 
        pause = false; 
       } 

      }), 
      MaterialDesignIcon.STOP.button(e -> audioService.stop())); 
    hBox.setAlignment(Pos.CENTER); 
    setCenter(new StackPane(hBox)); 
} 

을, 장소 audio.mp3과 같은 오디오 파일 (src/ios/assets/audio.mp3 아래)을 빌드하고 iOS에 배포합니다.

이 API는 언제든지 Charm Down에서 제공됩니다. 또한 좋은 구현 방법을 생각해 내면 자유롭게 공유하고 Pull Request을 만들 수 있습니다.

+0

이러한 변경 사항을 모두 적용하면 앱이 멈 춥니 다. 2016-07-30 12 : 32 : 50.769 GluonApp [3146 : 1115803] 오디오 재생 2016-07-30 12 : 32 : 50.770 GluonApp [3146 : 1115803] *** NSForwarding : 경고 : 개체 0x1d34b64 'Audio'클래스의 0x1d34b64 객체는 doesNotRecognizeSelector를 구현하지 않습니다. : 'Audio'클래스의 object 0x1d34b64가 doesNotRecognizeSelector를 구현하지 않습니다. - abort –

+0

모든 단계를 수행했는지 확인하십시오. 수정할 많은 파일이 있습니다. 수정 한 Charm Down을 성공적으로 구축 했습니까? iOS SDK 9.3을 사용하고 있습니까? –

+0

필자는 내 대답을 편집했지만'Audio.m'의 사소한 변경으로 가져 오기와 불필요한'view'를 제거했습니다. –