ACRCloud集成到android app [英] ACRCloud integration to android app

查看:200
本文介绍了ACRCloud集成到android app的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下用于音乐识别的代码.我正在使用意图服务来执行服务中的所有音乐识别.我已经完成了所有基本步骤,例如添加了所需的所有权限并在项目中添加了ACRCloud android SDK.

I have the following code for music recognition. I am using intent service to do all the music recognition in the service. I have done all the basic steps like adding all the permissions required and adding the ACRCloud android SDK in the project.

class SongIdentifyService(discoverPresenter : DiscoverPresenter? = null) : IACRCloudListener , IntentService("SongIdentifyService") {

private val callback : SongIdentificationCallback? = discoverPresenter
private val mClient : ACRCloudClient by lazy { ACRCloudClient() }
private val mConfig : ACRCloudConfig by lazy { ACRCloudConfig() }
private var initState : Boolean = false
private var mProcessing : Boolean = false


override fun onHandleIntent(intent: Intent?) {

    Log.d("SongIdentifyService", "onHandeIntent called" )

    setUpConfig()
    addConfigToClient()

    if (callback != null) {
        startIdentification(callback)
    }

}


public fun setUpConfig(){

    Log.d("SongIdentifyService", "setupConfig called")

    this.mConfig.acrcloudListener = this@SongIdentifyService

    this.mConfig.host = "some-host"
    this.mConfig.accessKey = "some-accesskey"
    this.mConfig.accessSecret = "some-secret"
    this.mConfig.protocol = ACRCloudConfig.ACRCloudNetworkProtocol.PROTOCOL_HTTP // PROTOCOL_HTTPS
    this.mConfig.reqMode = ACRCloudConfig.ACRCloudRecMode.REC_MODE_REMOTE

}

// Called to start identifying/discovering the song that is currently playing
fun startIdentification(callback: SongIdentificationCallback)
{

    Log.d("SongIdentifyService", "startIdentification called")

    if(!initState)
    {
        Log.d("AcrCloudImplementation", "init error")
    }
    if(!mProcessing) {

        mProcessing = true
        if (!mClient.startRecognize()) {

            mProcessing = false
            Log.d("AcrCloudImplementation" , "start error")

        }
    }
}

// Called to stop identifying/discovering song
fun stopIdentification()
{

    Log.d("SongIdentifyService", "stopIdentification called")
    if(mProcessing)
    {
        mClient.stopRecordToRecognize()
    }

    mProcessing = false
}

fun cancelListeningToIdentifySong()
{
    if(mProcessing)
    {
        mProcessing = false
        mClient.cancel()
    }
}

fun addConfigToClient(){

    Log.d("SongIdentifyService", "addConfigToClient called")


    this.initState = this.mClient.initWithConfig(this.mConfig)

    if(this.initState)
    {
        this.mClient.startPreRecord(3000)
    }
}


override fun onResult(result: String?) {

    Log.d("SongIdentifyService", "onResult called")
    Log.d("SongIdentifyService",result)

    mClient.cancel()
    mProcessing = false

    val result = Gson().fromJson(result, SongIdentificationResult :: class.java)

    if(result.status.code == 3000)
    {
        callback!!.onOfflineError()
    }
    else if(result.status.code == 1001)
    {
        callback!!.onSongNotFound()
    }
    else if(result.status.code == 0 )
    {
        callback!!.onSongFound(MusicDataMapper().convertFromDataModel(result))

        //callback!!.onSongFound(Song("", "", ""))
    }
    else
    {
        callback!!.onGenericError()
    }


}

override fun onVolumeChanged(p0: Double) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}


interface SongIdentificationCallback {

    // Called when the user is offline and music identification failed
    fun onOfflineError()

    // Called when a generic error occurs and music identification failed
    fun onGenericError()

    // Called when music identification completed but couldn't identify the song
    fun onSongNotFound()

    // Called when identification completed and a matching song was found
    fun onSongFound(song: Song)

}

}

现在,当我启动服务时,出现以下错误:

Now when I am starting the service I am getting the following error:

推荐答案

我检查了ACRCloudClient的实现及其扩展的android Activity.另外,ACRCloudClient使用共享的首选项(这就是为什么我得到空指针异常的原因).

I checked the implementation of the ACRCloudClient and its extends android Activity. Also ACRCloudClient uses shared preferences(that's why I am getting a null pointer exception).

由于在服务中保留对活动的引用不是一个好主意,因此最好在活动中实现上述代码.无论如何,识别的所有实现都是在ACRCloudClient类的单独线程中完成的,因此没有必要为此创建另一个服务.

Since keeping a reference to an activity in a service is not a good Idea its best to Implement the above code in the activity. All the implementation of recognizing is being done in a separate thread anyway in the ACRCloudClient class so there is no point of creating another service for that.

这篇关于ACRCloud集成到android app的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆