Java 尝试使用Delphi更改Android设备R/W权限时发生访问冲突

Java 尝试使用Delphi更改Android设备R/W权限时发生访问冲突,java,android,delphi,permissions,Java,Android,Delphi,Permissions,我正在使用优秀的通信工具,在一台计算机和一台硬件设备之间使用串行连接。从Delphi应用程序中可以看到,我的串行端口是“/dev/ttymxc3” 当我运行我的应用程序时,它告诉我“权限被拒绝”。如果我执行命令,从另一个端口的控制台访问 chmod 666 /dev/ttymxc3 然后再次运行我的应用程序,它工作正常。 因此,我尝试在我的应用程序中根据和“java.lang.Runtime”和“android.os.process”的导入执行此命令,如下所示 按下按钮,我希望更改代码的权限。

我正在使用优秀的通信工具,在一台计算机和一台硬件设备之间使用串行连接。从Delphi应用程序中可以看到,我的串行端口是“/dev/ttymxc3”

当我运行我的应用程序时,它告诉我“权限被拒绝”。如果我执行命令,从另一个端口的控制台访问

chmod 666 /dev/ttymxc3
然后再次运行我的应用程序,它工作正常。 因此,我尝试在我的应用程序中根据和“java.lang.Runtime”和“android.os.process”的导入执行此命令,如下所示

按下按钮,我希望更改代码的权限。不过,我的访问权限被侵犯了。正如评论中所建议的,为了找出这是从哪里来的(并且由于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应用程序中设置此设备节点的权限?如果是这样,我能改变我的应用程序许可证吗?

< p>我使用MaNI2用C++ Builder RX10 SeaTele和启动Android LoPoPoP和WiSoop-COMPRT组件,和你一样 我在使用C++方法时遇到了同样的问题(访问冲突) 但是我用另一种方法来解决我的问题,我建议用它 我想它解决了你的问题

在德尔菲

uses
  Posix.Stdlib


_system('su -c chmod 777 dev/ttyAMA0') ;
< C++ Builder < /P>
#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');
#包括
系统(“su-c chmod 777开发/TTYAM0”);
我在nanopi2中的串行端口是ttyam0
小心,为了成功地打开端口,我必须将SELINUX设置为权限模式
本说明
_系统('su-c set0');

我喜欢embarcadero
我喜欢C++ Builder

OK,首先是明显的问题:你是否已经用调试器跟踪到它,验证它实际上是在调用<代码> Exc< <代码>时出错,而不是别的什么?@梅森:好点。董事会执行Delphi应用程序,但不支持调试器,这一事实无助于解决问题——我不知道为什么和其他人在某些Android设备上也有同样的问题。我还希望我的错误对某人来说是如此明显,这样就足够了。不过,好主意-我会用一些信息来分解这些电话,并报告我的发现。是的。在处理奇怪的和意外的bug时,有意识地问一些非常明显的问题,例如这样的问题,在帮助解决问题方面会出人意料地有效。我假设控制台访问是以root用户身份运行的,但您的普通应用程序不是。您不能运行chmod来授予自己尚未拥有的权限;您只能向其他人授予访问权限(假设您已经是文件的所有者)。那么,您的应用程序是否已经拥有该文件,并且您希望向其他人授予访问权限?或者操作系统是否为您创建了此文件,而您的应用程序没有使用该文件所需的权限?除了chmod,你还能运行其他命令吗?@Rob:谢谢你的评论。正如你所说,我想知道这是否可能dev/ttymxc3'实际上是一个串行端口,似乎有人说这类事情是可行的。作为另一个解决方案,我可以以某种方式提高我的应用程序许可吗?我“拥有”这个董事会,我的应用程序将负责一切,所以从架构角度来看,这不是问题。请使用降价设置代码格式。更多信息
#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');