JavaFx Media는 아직 모바일 플랫폼으로 이식되지 않았으므로 누구나 기본 iOS APi를 사용하여 내 주/리소스 폴더에 저장할 사운드 mp3 파일을 재생할 수 있습니다. 글루온 프로젝트.Gluon Mobile iOS 오디오 플레이어
답변
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을 만들 수 있습니다.
이러한 변경 사항을 모두 적용하면 앱이 멈 춥니 다. 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 –
모든 단계를 수행했는지 확인하십시오. 수정할 많은 파일이 있습니다. 수정 한 Charm Down을 성공적으로 구축 했습니까? iOS SDK 9.3을 사용하고 있습니까? –
필자는 내 대답을 편집했지만'Audio.m'의 사소한 변경으로 가져 오기와 불필요한'view'를 제거했습니다. –