【发布时间】:2015-01-19 17:39:07
【问题描述】:
我正在使用出色的Com port for Android 使用UOODO Android board 和硬件设备之间的串行连接进行通信。从 Delphi App 中看到的我的串口是“/dev/ttymxc3”。
当我运行我的应用程序时,它告诉我“权限被拒绝”。如果我执行命令,则从另一个端口上的控制台访问
chmod 666 /dev/ttymxc3
然后再次运行我的应用程序,它工作正常。 因此,我尝试根据this SO question 以及从here on GitHub 导入的“java.lang.Runtime”和“android.os.process”从我的应用程序中执行此命令
uses
java.lang.Runtime,
Androidapi.Helpers;
procedure TForm1.Button1Click(Sender: TObject);
begin
TJRuntime.JavaClass.getRuntime.exec(StringToJString('chmod 666 /dev/ttymxc3'));
end;
我希望从代码中更改权限的按钮。我得到了访问冲突。正如 cmets 中所建议的那样,为了找出它的来源(并且因为 Delphi 调试器不适用于此设备),我执行了以下操作:
procedure TForm2.Button2Click(Sender: TObject);
var
RunTime : JRuntime;
S : JString;
begin
try
RunTime := TJRuntime.JavaClass.getRuntime;
if not Assigned( RunTime ) then
begin
ShowMessage( 'E1' );
Exit;
end;
except
on E:Exception do
ShowMessageFmt( 'E1A:%s', [E.Message] );
end;
try
S := StringToJString('chmod 666 /dev/ttymxc3');
if not Assigned( S ) then
begin
ShowMessage( 'E2' );
Exit;
end;
except
on E:Exception do
ShowMessageFmt( 'E2A:%s', [E.Message] );
end;
try
RunTime.exec( S );
except
on E:Exception do
ShowMessageFmt( 'E3A:%s', [E.Message] );
end;
end;
显示 AV 触发了我的“E3A”错误,即使用了“exec”。我的问题是:为什么我会得到这个 AV?我正在做的事情有致命的缺陷吗?即我是否应该能够从普通的 Delphi 应用程序中设置此设备节点的权限?如果是这样,我可以更改我的应用权限以允许这样做吗?
【问题讨论】:
-
好的,首先是一个明显的问题:您是否使用调试器对其进行了跟踪,以验证它实际上是在调用
exec时出错而不是其他原因? -
@Mason:好点子。开发板执行 Delphi 应用程序但不支持调试器这一事实无济于事——我不知道为什么,其他人在某些 Android 设备上也有同样的问题。我还希望我的错误对某人如此明显,这样就足够了。不过,好主意 - 我会用一些消息来分解电话并报告我的发现。
-
是的。在处理奇怪和意想不到的错误时,有意识地提出此类非常明显的问题对于帮助解决问题非常有效。
-
我会假设控制台访问是以 root 身份运行的,但您的普通应用程序不是。您不能运行 chmod 来授予自己尚未拥有的权限;您只能授予其他人访问权限(假设您已经是文件的所有者)。那么,您的应用程序是否已经拥有该文件,并且您想授予其他人访问权限?还是操作系统为您创建了此文件,而您的应用程序没有使用它所需的权限?除了chmod,你还能运行other命令吗?
-
@Rob:感谢您的评论。正如你所说,我想知道这是否可能。 'dev/ttymxc3' 实际上是一个串行端口,似乎确实有人说这种东西有效。作为另一种解决方案,我可以以某种方式提高我的应用程序权限吗?我“拥有”董事会,我的应用程序将负责一切,因此在架构方面这不是问题。
标签: java android delphi permissions