我正在使用 Delphi-Berlin Update-2
Android 服务不能使用 log.d(),因为它需要使用 FMX.Types,使用它会导致整个应用程序崩溃。
我试图从 FMX.Types 中提取日志部分,但没有成功。
是否有任何解决方案让 log.d 工作?
到目前为止,我一直在为此使用 IdUDP,但这不是一个理想的解决方案。
最佳答案
我正在使用 Tokyo 并在真实的 LG-LS997 设备上看到同样的问题。
你可以这样使用内置的LOGI
:
uses Androidapi.Log;
procedure MyProcedure(msg: String);
var
M: TMarshaller;
begin
LOGI(M.AsUtf8(msg).ToPointer);
end;
更多信息:
每次我在我的服务中包含一个 FMX 单元时,我都会遇到一个段错误。 Log.d
调用 LOGI
,后者调用 Android NDK 函数 __android_log_write
。还有用于格式化的__android_log_print
,不过还没有换行。无论如何,您可能应该只在 Delphi 中格式化并调用 __android_log_write
。
LOGI
被定义为以日志级别 ANDROID_LOG_INFO
调用 __android_log_write
。 Warn、error 和 fatal 也被封装为 LOGW
、LOGE
和 LOGF
。
我在这里包含了其余的日志记录级别(未经测试,不包括 ANDROID_LOG_UNKNOWN
):
function LOGDEF(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_DEFAULT, 'default', Text);
end;
function LOGV(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_VERBOSE, 'verbose', Text);
end;
function LOGDBG(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_DEBUG, 'debug', Text);
end;
function LOGS(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_SILENT, 'silent', Text);
end;
关于android - log.d 不适用于 Android 服务(Delphi Berlin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41102803/