【问题标题】:Access violation trying to change Android device R/W permission with Delphi尝试使用 Delphi 更改 Android 设备 R/W 权限的访问冲突
【发布时间】: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


【解决方案1】:

我将 nanopi2 与 c++ builder rx10 seatel 一起使用,并启动了与您相同的 android lolipop 和 winSoft comport 组件 当我使用你的方法时,我在 c++ builder 中遇到了同样的问题(访问冲突) 但我使用另一种方法来解决我建议使用的问题 我认为它解决了你的问题

在德尔福中

uses
  Posix.Stdlib


_system('su -c chmod 777 dev/ttyAMA0') ;

在 C++ 构建器中

#include <Posix.Stdlib.hpp>

system('su -c chmod 777 dev/ttyAMA0') ;

my serial port in nanopi2 is ttyAMA0

carefull for sucssesfully open port  i had to set SELINUX to permission mode    by 
this instruction

 _system('su -c setenforce 0');

http://www.fmxexpress.com/launch-a-url-or-document-on-ios-and-android-with-delphi-firemonkey/

我喜欢 embarcadero 我喜欢 c++ builder

【讨论】:

  • 请使用 Markdown 格式化您的代码。欲了解更多信息Formatting
猜你喜欢
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多