質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

1回答

830閲覧

Kivyアプリケーションを用いたAndroidアプリケーションにおいて、内部ストレージに書き込みができない。

ulthar

総合スコア8

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2023/04/14 07:39

実現したいこと

現在Kivy2.1.0、Python3.9.9で日記のアプリケーションを作成しています。
コーディング後Buildozer 1.5.1.dev0でパッケージング化し、アプリケーションが正常に動作することを確認しました。

さらなる改良として、日記の内容をsaveしていくsqlite3の.dbファイルを、操作しやすいようにAndroidの内部ストレージの/storage/emulated/0/Android/data/以下に作ったフォルダに保存したいと考えています。

AndroidのPermissionを取得して、/storage/emulated/0/以下のフォルダを参照できるようにはなったのですが、/storage/emulated/0/Android/data/以下にフォルダを作ろうとするところでエラーが起こります。

さらにほかのPermissionが必要なのでしょうか。

発生している問題・エラーメッセージ

作製したapkファイルをAndroidにインストールした後、adb logcat -s Pythonで取得したLog

04-14 16:20:08.023 30072 30108 I python : Traceback (most recent call last): 04-14 16:20:08.023 30072 30108 I python : File "/home/agjpupjga/kivy/yumenikki/.buildozer/android/app/main.py", line 31, in <module> 04-14 16:20:08.023 30072 30108 I python : PermissionError: [Errno 13] Permission denied: '/storage/emulated/0/Android/data/jp.ulthar.yumenikki/' 04-14 16:20:08.023 30072 30108 I python : Python for android ended.

該当のソースコード

Python

1from datetime import datetime 2from dateutil.relativedelta import relativedelta 3import sqlite3 4import os 5from kivy.lang import Builder 6from kivymd.app import MDApp 7from kivymd.uix.boxlayout import MDBoxLayout 8from kivymd.uix.button import MDRectangleFlatButton,MDRaisedButton 9from kivymd.uix.label import MDLabel 10from kivymd.uix.dialog import MDDialog 11from kivymd.uix.list import OneLineRightIconListItem 12from kivy.utils import platform 13 14from kivy.core.window import Window 15 16from kivy.core.text import LabelBase, DEFAULT_FONT 17from kivy.resources import resource_add_path 18resource_add_path("./fonts") 19LabelBase.register(DEFAULT_FONT, "mplus-2c-regular.ttf") 20 21 22if platform == "android": 23 from android.permissions import request_permissions,Permission 24 request_permissions([Permission.WRITE_EXTERNAL_STORAGE,Permission.READ_EXTERNAL_STORAGE]) 25 from android.storage import primary_external_storage_path 26 import os 27 primary_ex_path=primary_external_storage_path() 28 29if os.path.exists(primary_ex_path+"/Android/data/jp.ulthar.yumenikki/")==False: 30 os.mkdir(primary_ex_path+"/Android/data/jp.ulthar.yumenikki/") 31conn=sqlite3.connect(primary_ex_path+"/Android/data/jp.ulthar.yumenikki/"+"yumenikki.db") 32cur=conn.cursor() 33cur.execute("SELECT * FROM sqlite_master WHERE type='table' and name = 'yume'") 34if not cur.fetchone(): 35 cur.execute("Create table yume (id integer primary key autoincrement, date, yume)") 36===文字数制限のため省略=== 37class DiaryApp(MDApp): 38 today=datetime.today().date() 39 def build(self): 40 self.t_year=str(self.today).split("-")[0] 41 self.t_month=str(self.today).split("-")[1] 42 self.t_date=str(self.today).split("-")[2] 43 Builder.load_string(KV) 44 return MainDiary() 45 46#Window.size=(480,800) 47if __name__ == '__main__': 48 DiaryApp().run()

変更点のみ

buildozer

1[app] 2 3# (str) Title of your application 4title = yumenikki 5 6# (str) Package name 7package.name = yumenikki 8 9# (str) Package domain (needed for android/ios packaging) 10package.domain = jp.ulthar 11 12# (list) Source files to include (let empty to include all the files) 13source.include_exts = py,png,jpg,kv,atlas,db,ttf 14 15 16# (list) Application requirements 17# comma separated e.g. requirements = sqlite3,kivy 18requirements = python3,kivy==2.1.0,kivymd==1.0.2,sqlite3,android,dateutil,plyer,Pillow 19 20 21 22 23# Kivy version to use 24osx.kivy_version = 2.1.0 25 26 27 28# (list) Permissions 29# (See https://python-for-android.readthedocs.io/en/latest/buildoptions/#build-options-1 for all the supported syntaxes and properties) 30android.permissions = android.permission.INTERNET, (name=android.permission.WRITE_EXTERNAL_STORAGE;maxSdkVersion=18) 31 32 33# (int) Target Android API, should be as high as possible. 34android.api = 33 35

とりあえず現状公開などは考えておらず、自前のAndroid13の端末で機能すればよいと考えています。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Android 10 からは共有ストレージへのアクセスの仕方が大きく変わっていて普通にファイルシステムを触るようにはいかないようです。この辺については

https://github.com/Android-for-Python/Android-for-Python-Users

に詳しく書かれています。あと権限を要求する場所もこれによるとApp.build()内かApp.on_start()が終わった後となっているので、載せられたコードのようにモジュールレベルで行うのはまずそうです。

投稿2023/05/25 08:31

編集2023/05/25 08:32
gottadiveintopy

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問