问题描述
我无法翻译(从 Kotlin 到 Java)或理解以下文件的内部类中的语句 service.connectionListener = { addConnection(it) }
:
class MainActivity : AppCompatActivity() {
private val serviceConnection = CallServiceConnection()
private var connection: TComConnection? = null
private val tcomManager: TComManager by lazy { TComManager(applicationContext) }
private val requiredPermissions =
arrayOf(
android.Manifest.permission.READ_PHONE_STATE,android.Manifest.permission.READ_CALL_LOG
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
drop_btn.setonClickListener { closeConnection() }
answer_btn.setonClickListener {
val conn = connection
if (conn != null) {
conn.setActive()
} else {
Toast.makeText(applicationContext,"there is no call",Toast.LENGTH_SHORT).show()
}
}
incoming_btn.setonClickListener {
if (!hasPermissions()) {
requestPermissions(requiredPermissions,1)
Toast.makeText(applicationContext,"don't have permissions",Toast.LENGTH_SHORT).show()
return@setonClickListener
}
try {
if (tcomManager.registeraccount()) {
tcomManager.addIncomingCall()
} else {
Toast.makeText(applicationContext,"account isn't registered",Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
Toast.makeText(applicationContext,e.message,Toast.LENGTH_SHORT).show()
}
}
outgoing_btn.setonClickListener {
if (!hasPermissions()) {
requestPermissions(requiredPermissions,Toast.LENGTH_SHORT).show()
return@setonClickListener
}
try {
if (tcomManager.registeraccount()) {
tcomManager.addOutgoingCall()
} else {
Toast.makeText(applicationContext,Toast.LENGTH_SHORT).show()
}
}
}
override fun onStart() {
super.onStart()
Intent(this,CallService::class.java).also { intent ->
bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE)
}
}
override fun onStop() {
super.onStop()
closeConnection()
unbindService(serviceConnection)
}
private fun hasPermissions(): Boolean {
return requiredPermissions.all { checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED }
}
private fun closeConnection() {
connection?.let {
if (!it.isClosed()) {
it.setdisconnected(disconnectCause(disconnectCause.CANCELED))
}
it.listener = {}
}
val stateText = "state: no call"
state_label.text = stateText
}
private fun addConnection(newConnection: TComConnection) {
newConnection.listener = {
val stateText = "state: ${Connection.statetoString(it)}"
state_label.text = stateText
}
connection = newConnection
val stateText = "state: ${Connection.statetoString(newConnection.state)}"
state_label.text = stateText
}
inner class CallServiceConnection : ServiceConnection {
private var callService: CallService? = null
override fun onServiceConnected(name: ComponentName?,binder: IBinder?) {
val callSrvBinder = binder as CallService.CallServiceBinder
val service = callSrvBinder.getCallService()
service.connectionListener = { addConnection(it) }
callService = service
}
override fun onServicedisconnected(name: ComponentName?) {
callService?.connectionListener = {}
}
}
}
我无法翻译上述语句(已注释掉):
public class CallServiceConnection implements ServiceConnection {
private CallService callService = null;
@Override
public void onServiceConnected(ComponentName name,IBinder binder) {
CallService.CallServiceBinder callSrvBinder = (CallService.CallServiceBinder)binder;
CallService service = callSrvBinder.getCallService();
//service.addConnection(); // <--------
callService = service;
}
@Override
public void onServicedisconnected(ComponentName name) {
callService.addConnection(null);
}
}
如果您需要更多参考资料, 这是我正在翻译的项目: https://github.com/dmalukov/TComTest/tree/master/app/src/main/java/com/example/tcomtest
这是问题的扩展形式:
Self managed phone call using Telecom
解决方法
Kotlin 中的这段代码:
service.connectionListener = { addConnection(it) }
对应于Java中的这段代码:
service.setConnectionListener(connection -> {
addConnection(connection);
return Unit.INSTANCE;
});
假设 Service
类是用 Kotlin 编写的,如下所示:
class Service {
var connectionListener: (Connection) -> Unit = {}
}
更新:
如果您也想重写 Service
类,您的代码将是:
service.connectionListener = connection -> {
addConnection(connection);
return null;
};
Service
Java 类:
class Service {
Function<Connection,Void> connectionListener = connection -> null;
}