如何解决在.NET MAUI Android Emulator中为.armv8文件创建进程时出现的“权限被拒绝错误”

yzuktlbb  于 2023-02-27  发布在  Android
关注(0)|答案(1)|浏览(231)
    • bounty将在6天后过期**。回答此问题可获得+50声望奖励。Ramon Brokking希望引起更多人对此问题的关注:比目前给出的更详细的答案。我很想知道让它100%工作的确切方法。

会给奖金赏金,如果它也将工作同样的方式为iOS,我想支持在未来以及.
我有一个. NET MAUI mobile-project,我正在尝试调用从C++编译的代码,即.armv8文件。我正在尝试Process类来使其工作。
我尝试了以下步骤:
1.在我的项目中将.armv8文件保存为Embedded resource,并将Copy to output directory设置为Copy if newer。该文件位于mobile-project的文件夹中(因此不在项目的平台部分,而是在项目根目录下的文件夹中)。

1.请求Android所需的文件权限(读和写):

PermissionStatus status = await Permissions.RequestAsync<Permissions.StorageRead>();
        PermissionStatus status2 = await Permissions.RequestAsync<Permissions.StorageWrite>();

已成功授予这些权限。
1.使用以下代码将文件复制到Android特定的AppData文件夹:

private string ExtractFiles()
        {
            var assembly = typeof(App).GetTypeInfo().Assembly;

            foreach (var res in assembly.GetManifestResourceNames())
            {
                if (res.Contains(".armv8"))
                {
                    // read source file 
                    using var stream = assembly.GetManifestResourceStream(res);
                    using var reader = new StreamReader(stream);
                    var content = reader.ReadToEnd();

                    // generate target path inside data folder
                    string targetFile = System.IO.Path.Combine(FileSystem.Current.AppDataDirectory, res);

                    // write file into data folder
                    using FileStream outputStream = System.IO.File.OpenWrite(targetFile);
                    using StreamWriter streamWriter = new StreamWriter(outputStream);

                    streamWriter.Write(content);

                    return targetFile;
                }
            }

            return string.Empty;
        }

1.尝试使用以下代码更改要打开的文件权限(参数是步骤2的输出):

public partial void SetPermissionToFile(string path)
        {
            string[] cmd = { "chmod", "744", path };
            Java.Lang.Runtime? runtime = Java.Lang.Runtime.GetRuntime();

            runtime?.Exec(cmd);
        }

1.使用文件启动进程,代码如下:

_processStartInfo = new ProcessStartInfo
            {
                FileName = path,
                UseShellExecute = false,
                RedirectStandardError = true,
                RedirectStandardInput = true,
                RedirectStandardOutput = true
            };
            _process = new Process { StartInfo = _processStartInfo };
            _process.Start();

_process.Start()方法被调用时,我得到一个Permission denied错误,如下所示:

这是因为我正在使用一个模拟器吗?或者是文件可能在错误的目录中,进程无法使用?
我看到一个类似的帖子,得到了它的工作,但似乎并不适合我:https://chess.stackexchange.com/questions/17685/how-to-send-uci-messages-from-c-app-to-stockfish-on-android/17856#17856?newreg=ea938bb4ac3147878e4fdc29626050cc
提前感谢你试图帮助我:)

y53ybaqx

y53ybaqx1#

我已经在一个新的. Net Maui项目上测试了你的代码。因为我没有**. armv8文件,所以我用pdf文件代替它。在android上,出现了同样的错误消息。但是当我把UseShellExecute = false改为true时。它可以在windows上执行。
这是因为我正在使用一个模拟器吗?或者是文件可能在错误的目录中,进程无法使用?
我已经在其他应用的文件夹中测试过了,在小米的实体设备和安卓12模拟器上也测试过了,结果都是一样的。
另外,我根据这个Access denied (0x80004005) on Process.Start() in android app的案例创建了一个新的Xamarin.Android项目,然后我得到了拒绝访问的错误,即使我执行了string[] cmd = { "chmod", "744", path };命令,我也不能确定原因是pdf文件不能被授予可执行权限,或者chmod命令不能在更高的Android版本上工作。
我也试着测试了
chmod 777命令,并用android studio文件资源管理器检查了结果。发现文件权限没有改变。看起来chmod命令不再起作用了。
最后,您可以尝试在Xamarin中测试运行
.armv8**文件。根据我提供的链接Android项目,并检查它是否是maui中的bug。您也可以提供文件,我明天会测试它。

    • 更新日期:**

我已经尝试了.armv8文件与您的代码,同样的错误出现。我已经检查了chmod命令已成功执行。
然后创建一个新的Xamarin.Android项目,并使用Android Studio的文件资源管理器将文件放入/data/data/com.companyname.prjecttest/files/_stockfish.android.armv8路径中,然后运行以下代码:

var path = "/data/data/com.companyname.testprocess/files/_stockfish.android.armv8";
 string[] cmd = { "chmod", "744", path };
 Java.Lang.Runtime? runtime = Java.Lang.Runtime.GetRuntime();
 var res = runtime?.Exec(cmd).WaitFor();
// this line can check if the chmod command excute successfully.
// Value 0 means success. But I use the Android Studio's File Explorer, 
//and the file's permission is 777. The code need't to run.
 var _processStartInfo = new ProcessStartInfo
    {
      FileName = path,
      UseShellExecute = false,
      CreateNoWindow = false,
    };
 var _process = new Process { StartInfo = _processStartInfo };
 _process.Start();

没有错误信息,但也没有任何变化,我可以看到。这似乎是一个错误,在。net maui。你可以尝试报告它的github。

相关问题