Помогите пожалуйста с компиляцией kivy в apk, как сделать чтобы на андройде спрашивало разрешение на память
это main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.filechooser import FileChooserListView
from kivy.uix.label import Label
from kivy.core.audio import SoundLoader
from plyer import notification
from kivy.utils import platform
if platform == "android":
from android.permissions import request_permissions, Permission
request_permissions([Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE])
class MusicPlayer(App):
def build(self):
self.layout = BoxLayout(orientation='vertical')
self.file_chooser = FileChooserListView(path='/', filters=['*.mp3'])
self.file_chooser.bind(on_submit=self.on_file_selected)
self.play_button = Button(text='Play', on_press=self.play_music, size_hint=(None, None), size=(100, 50))
self.pause_button = Button(text='Pause', on_press=self.pause_music, size_hint=(None, None), size=(100, 50))
self.stop_button = Button(text='Stop', on_press=self.stop_music, size_hint=(None, None), size=(100, 50))
self.next_button = Button(text='Next', on_press=self.next_track, size_hint=(None, None), size=(100, 50))
self.layout.add_widget(self.file_chooser)
control_layout = BoxLayout()
control_layout.add_widget(self.play_button)
control_layout.add_widget(self.pause_button)
control_layout.add_widget(self.stop_button)
control_layout.add_widget(self.next_button)
self.layout.add_widget(control_layout)
self.music = None
self.current_track_index = 0
self.tracks = []
self.selected_file_label = Label(text="No file selected")
self.layout.add_widget(self.selected_file_label)
self.notification = None
return self.layout
def on_start(self, **kwargs):
if platform == "android":
from android.permissions import request_permissions, Permission
request_permissions([Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE])
def on_file_selected(self, instance, selection, *args):
if selection:
self.tracks = selection
self.selected_file = selection[0]
self.selected_file_label.text = f"Selected file: {self.selected_file}"
self.current_track_index = 0
def play_music(self, instance):
if self.tracks:
if self.music and self.music.state == 'play':
self.music.stop()
if self.notification:
self.notification.cancel()
self.notification = None
self.music = SoundLoader.load(self.selected_file)
if self.music:
try:
self.music.play()
self.create_notification()
except Exception as e:
print(f"Error playing music: {e}")
else:
print("Music started playing.")
else:
print("Failed to load music.")
def create_notification(self):
if self.music:
if not self.notification:
self.notification = notification.notify(
title='Music Player',
message=f'Now playing: {self.selected_file}',
app_name='Music Player',
actions=[
{'title': 'Pause', 'callback': self.pause_music_notification},
{'title': 'Stop', 'callback': self.stop_music_notification},
{'title': 'Next', 'callback': self.next_track_notification},
]
)
def pause_music(self, instance):
if self.music and self.music.state == 'play':
self.music.stop()
if self.notification:
self.notification.cancel()
self.notification = None
def pause_music_notification(self):
self.pause_music(None)
def stop_music(self, instance):
if self.music:
self.music.stop()
if self.notification:
self.notification.cancel()
self.notification = None
def stop_music_notification(self):
self.stop_music(None)
def next_track(self, instance):
if self.tracks:
self.current_track_index = (self.current_track_index + 1) % len(self.tracks)
self.selected_file = self.tracks[self.current_track_index]
self.selected_file_label.text = f"Selected file: {self.selected_file}"
self.play_music(None)
def next_track_notification(self):
self.next_track(None)
if __name__ == '__main__':
MusicPlayer().run()
а это buidozer.spec
[app]
# (str) Title of your application
title = MusicPlayer
# (str) Package name
package.name = musicplayer
# (str) Package domain (needed for android/ios packaging)
package.domain = org.musplayer
# (str) Source code where the main.py live
source.dir = .
# (list) Source files to include (leave empty to include all the files)
source.include_exts = py,png,jpg,kv,atlas
# (list) List of inclusions using pattern matching
#source.include_patterns = assets/*,images/*.png
# (list) Source files to exclude (leave empty to not exclude anything)
#source.exclude_exts = spec
# (list) List of directory to exclude (leave empty to not exclude anything)
#source.exclude_dirs = tests, bin, venv
# (list) List of exclusions using pattern matching
# Do not prefix with './'
#source.exclude_patterns = license,images/*/*.jpg
# (str) Application versioning (method 1)
version = 0.1
# (str) Application versioning (method 2)
# version.regex = __version__ = ['"](.*)['"]
# version.filename = %(source.dir)s/main.py
# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy,plyer,android,kivymd
#android.api = 33
я компилирую под андроид запускаю на эмуляторе на пк все работает а на телефоне андроид 13 приложение тоже запускается но не спрашивает разрешение на память и у меня не отображается в нем выбор трека хотя на эмуляторе все норм