yingyan005 / X-Chess

中国象棋打谱助手 Chinese Chess Score Assistant
15 stars 5 forks source link

PermissionError: [Errno 13] Permission denied #1

Open skarl-api opened 6 months ago

skarl-api commented 6 months ago

使用安卓桌面模拟器,版本是34

from kivy.app import App from jnius import autoclass, cast from kivy.uix.button import Button from kivy.resources import resource_find import subprocess import os from android.permissions import request_permissions, Permission, check_permission from android import mActivity, api_version

class UCIRunnerApp(App):

def build(self):
    return Button(text='Run UCI Engine', on_release=self.run_uci_engine)

def run_uci_engine(self, instance):
    myPermissions = [("android.permission.RUN_SCRIPT"),("android.permission.MANAGE_EXTERNAL_STORAGE"),
                         ("android.permission.READ_EXTERNAL_STORAGE"),("android.permission.WRITE_EXTERNAL_STORAGE"),
                         ("android.permission.FOREGROUND_SERVICE"),("android.permission.SYSTEM_ALERT_WINDOW"),
                         ("android.permission.SYSTEM_OVERLAY_WINDOW"),("android.permission.VIBRATE"),
                         ("android.permission.EXECUTE_SHELL_COMMAND"),("android.permission.EXECUTE_COMMAND"),
                         ("android.permission.INTERNET"),
                         ("android.permission.MANAGE_ALL_FILES_ACCESS_PERMISSION"),("android.permission.MANAGE_EXTERNAL_STORAGE")
                        ]
    request_permissions(myPermissions)
    if api_version > 29:
        Environment = autoclass("android.os.Environment")
        if not Environment.isExternalStorageManager():
            self.permissions_external_storage()
    p_w = "android.permission.WRITE_EXTERNAL_STORAGE"
    if check_permission(p_w):
        Logger.info('有 WRITE_EXTERNAL_STORAGE 权限')
        self. permission_callback()

def permission_callback(self):
    try:
        PythonActivity = autoclass("org.kivy.android.PythonActivity")
        context = PythonActivity.mActivity
        package_name = context.getPackageName()
        Logger.info(f"package_name:{package_name}")
        data_directory = f"/data/data/{package_name}/files/app/uci/pikafish"
        Logger.info(f"Data directory:{data_directory}")

        cmd = ['chmod', '777', f'{data_directory}']
        result = subprocess.run(cmd, stdout=subprocess.PIPE)
        Logger.info(f"UCIEngine:subprocess.run {cmd},{result.stdout.decode()}")

        cmd = ['ls', '-la', f'{data_directory}']
        result = subprocess.run(cmd, stdout=subprocess.PIPE)
        Logger.info(f"UCIEngine:subprocess.run {cmd},{result.stdout.decode()}")

        pro_name = os.path.basename(data_directory)
        cmd = ['ps', '-ef', '|', 'grep', f'{pro_name}']
        result = subprocess.run(cmd, stdout=subprocess.PIPE)
        Logger.info(f"UCIEngine:subprocess.run {cmd},{result.stdout.decode()}")
        file_path = os.path.dirname(f'{data_directory}')
        Logger.info(file_path)
        process = subprocess.Popen([data_directory], cwd=file_path, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True)
        Logger.info(f"UCIEngine:subprocess.Popen {original_engine_path}, pid:{process.pid}")
        # 与引擎交互
        self.write(process, 'uci')
        self.read(process, "uciok")
    except Exception as e:
        Logger.exception(e)

def permissions_external_storage(self):
    PythonActivity = autoclass("org.kivy.android.PythonActivity")
    Environment = autoclass("android.os.Environment")
    Intent = autoclass("android.content.Intent")
    Settings = autoclass("android.provider.Settings")
    Uri = autoclass("android.net.Uri")
    if api_version > 29:
        # If you have access to the external storage, do whatever you need
        if Environment.isExternalStorageManager():
            # If you don't have access, launch a new activity to show the user the system's dialog
            # to allow access to the external storage
            pass
        else:
            try:
                activity = mActivity.getApplicationContext()
                uri = Uri.parse("package:" + activity.getPackageName())
                intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri)
                currentActivity = cast(
                    "android.app.Activity", PythonActivity.mActivity
                )
                currentActivity.startActivityForResult(intent, 101)
            except:
                intent = Intent()
                intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
                currentActivity = cast(
                    "android.app.Activity", PythonActivity.mActivity
                )
                currentActivity.startActivityForResult(intent, 101)

def write(self, process, message):
    try:
        process.stdin.write(message + "\n")
        process.stdin.flush()
    except Exception as e:
        Logger.exception(e)

def read(self, process, keyword):
    output = []
    while True:
        line = process.stdout.readline()
        if not line and process.poll() is not None:
            break
        Logger.info(line)
        output.append(line)
        if line.startswith(keyword):
            break
    return output

if name == 'main': UCIRunnerApp().run()

yingyan005 commented 6 months ago

buildozer.spec

(int) Target Android API, should be as high as possible.

android.api = 28

原始邮件

发件人:"skarl-api"< @.*** >;

发件时间:2024/2/20 12:01

收件人:"yingyan005/X-Chess"< @.*** >;

抄送人:"Subscribed"< @.*** >;

主题:[yingyan005/X-Chess] PermissionError: [Errno 13] Permission denied(Issue #1)

from kivy.app import App from jnius import autoclass, cast from kivy.uix.button import Button from kivy.resources import resource_find import subprocess import os from android.permissions import request_permissions, Permission, check_permission from android import mActivity, api_version

class UCIRunnerApp(App): def build(self): return Button(text='Run UCI Engine', on_release=self.run_uci_engine) def run_uci_engine(self, instance): myPermissions = [("android.permission.RUN_SCRIPT"),("android.permission.MANAGE_EXTERNAL_STORAGE"), ("android.permission.READ_EXTERNAL_STORAGE"),("android.permission.WRITE_EXTERNAL_STORAGE"), ("android.permission.FOREGROUND_SERVICE"),("android.permission.SYSTEM_ALERT_WINDOW"), ("android.permission.SYSTEM_OVERLAY_WINDOW"),("android.permission.VIBRATE"), ("android.permission.EXECUTE_SHELL_COMMAND"),("android.permission.EXECUTE_COMMAND"), ("android.permission.INTERNET"), ("android.permission.MANAGE_ALL_FILES_ACCESS_PERMISSION"),("android.permission.MANAGE_EXTERNAL_STORAGE") ] request_permissions(myPermissions) if api_version > 29: Environment = autoclass("android.os.Environment") if not Environment.isExternalStorageManager(): self.permissions_external_storage() p_w = "android.permission.WRITE_EXTERNAL_STORAGE" if check_permission(p_w): Logger.info('有 WRITE_EXTERNAL_STORAGE 权限') original_engine_path = resource_find('king/assets/uci/CCStockFishArmv8') Logger.info(original_engine_path) self.permission_callback(original_engine_path) def permission_callback(self, original_engine_path): try: PythonActivity = autoclass("org.kivy.android.PythonActivity") context = PythonActivity.mActivity package_name = context.getPackageName() Logger.info(f"package_name:{package_name}") data_directory = f"/data/data/{package_name}/files/app/uci/pikafish" Logger.info(f"Data directory:{data_directory}") cmd = ['chmod', '777', f'{data_directory}'] result = subprocess.run(cmd, stdout=subprocess.PIPE) Logger.info(f"UCIEngine:subprocess.run {cmd},{result.stdout.decode()}") cmd = ['ls', '-la', f'{data_directory}'] result = subprocess.run(cmd, stdout=subprocess.PIPE) Logger.info(f"UCIEngine:subprocess.run {cmd},{result.stdout.decode()}") pro_name = os.path.basename(data_directory) cmd = ['ps', '-ef', '|', 'grep', f'{pro_name}'] result = subprocess.run(cmd, stdout=subprocess.PIPE) Logger.info(f"UCIEngine:subprocess.run {cmd},{result.stdout.decode()}") file_path = os.path.dirname(f'{data_directory}') Logger.info(file_path) process = subprocess.Popen([data_directory], cwd=file_path, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True) Logger.info(f"UCIEngine:subprocess.Popen {original_engine_path}, pid:{process.pid}") # 与引擎交互 self.write(process, 'uci') self.read(process, "uciok") except Exception as e: Logger.exception(e) def permissions_external_storage(self): PythonActivity = autoclass("org.kivy.android.PythonActivity") Environment = autoclass("android.os.Environment") Intent = autoclass("android.content.Intent") Settings = autoclass("android.provider.Settings") Uri = autoclass("android.net.Uri") if api_version > 29: # If you have access to the external storage, do whatever you need if Environment.isExternalStorageManager(): # If you don't have access, launch a new activity to show the user the system's dialog # to allow access to the external storage pass else: try: activity = mActivity.getApplicationContext() uri = Uri.parse("package:" + activity.getPackageName()) intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri) currentActivity = cast( "android.app.Activity", PythonActivity.mActivity ) currentActivity.startActivityForResult(intent, 101) except: intent = Intent() intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) currentActivity = cast( "android.app.Activity", PythonActivity.mActivity ) currentActivity.startActivityForResult(intent, 101) def write(self, process, message): try: process.stdin.write(message + "\n") process.stdin.flush() except Exception as e: Logger.exception(e) def read(self, process, keyword): output = [] while True: line = process.stdout.readline() if not line and process.poll() is not None: break Logger.info(line) output.append(line) if line.startswith(keyword): break return output
if name == 'main': UCIRunnerApp().run()

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>

skarl-api commented 6 months ago

buildozer.spec # (int) Target Android API, should be as high as possible. android.api = 28

按照这个方式处理了,问题依然存在;PermissionError: [Errno 13] Permission denied: '/data/data/org.abc/files/app/king/assets/uci/pikafish'

yingyan005 commented 6 months ago

不要把pikafish作为assets,再试试

原始邮件

发件人:"skarl-api"< @.*** >;

发件时间:2024/2/20 17:09

收件人:"yingyan005/X-Chess"< @.*** >;

抄送人:"yingyan005"< @. >;"Comment"< @. >;

主题:Re: [yingyan005/X-Chess] PermissionError: [Errno 13] Permissiondenied (Issue #1)

buildozer.spec # (int) Target Android API, should be as high as possible. android.api = 28 按照这个方式处理了,问题依然存在;PermissionError: [Errno 13] Permission denied: '/data/data/org.abc/files/app/king/assets/uci/pikafish'

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

skarl-api commented 6 months ago

不要把pikafish作为assets,再试试

PermissionError: [Errno 13] Permission denied: '/data/data/org.abc/files/app/uci/pikafish'

skarl-api commented 6 months ago

@yingyan005 辛苦帮助看一下

skarl-api commented 6 months ago

奇怪的是文件权限已经是-rwxrwxrwx的了 但是就是出现问题

yingyan005 commented 6 months ago

实在不行,你试下外置能否调起来

原始邮件

发件人:"skarl-api"< @.*** >;

发件时间:2024/2/22 17:26

收件人:"yingyan005/X-Chess"< @.*** >;

抄送人:"yingyan005"< @. >;"Mention"< @. >;

主题:Re: [yingyan005/X-Chess] PermissionError: [Errno 13] Permissiondenied (Issue #1)

奇怪的是文件权限已经是-rwxrwxrwx的了 但是就是出现问题

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

skarl-api commented 6 months ago

实在不行,你试下外置能否调起来

SD CARD?