Re: 【Android】SDカード内のtxtファイルを読み込む方法 ( No.1 ) |
- 名前:管理人 日時:2020/08/16 00:08
方法はあるにはあるのですが、Android はあまり SDカードへのアクセスを
推奨していないので、Androidのバージョン毎に SDカードへのアクセス方法が
異なったりしてなかなか難易度の高い処理となります
( SDカードに保存されたファイルも見れるビューアーアプリなどは、
色々なバージョンの Android でも動作するように色々なバージョン用の
『SDカードにアクセスする処理』を書いて、新しい Android のバージョンが
登場すると SDカードへのアクセス方法も変化して古いバージョン用の
『SDカードにアクセスする処理』が動作しなくなったりするので、
その度に新しい『SDカードにアクセスする処理』を組んだりして大変なようです… )
なので『どうしてもSDカード内にあるtxtファイルを読み込まないといけない』という場合
以外はお勧めできません…
通常の読み込みファイルのように『プロジェクトに txtファイルを追加して読み込む』
では不都合がありますでしょうか?
|
Re: 【Android】SDカード内のtxtファイルを読み込む方法 ( No.2 ) |
- 名前:Ikuzu 日時:2020/08/17 03:16
返信ありがとうございます。
初心者の私には厳しそうですね...
携帯からファイルを追加できるようにしたいのでSDカードか内部ストレージを使いたいです。
諦めて内部ストレージでやろうとしてみたのですがうまく読み込めません
int android_main(void) {
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.txt ファイルを開く
int FileHandle = FileRead_open("/storage/emulated/0/test.txt");
char String[256];
FileRead_gets(String, 256, FileHandle);
// ファイルを閉じる
FileRead_close(FileHandle);
DrawString(0, 0, String, GetColor(255, 255, 255));
WaitKey(); // キー入力待ち
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
SDカードと同じく内部ストレージも難しいのでしょうか?
|
Re: 【Android】SDカード内のtxtファイルを読み込む方法 ( No.3 ) |
- 名前:あいおい? 日時:2020/08/17 09:01
Androidにはアプリ自体のプライベートなファイルの置き場所と、それ以外の共有スペースという保存場所があって。前者の方は特別な権限を必要としませんが、後者は適切な設定が必要です
アプリ専用のフォルダは /data/data/com.example/files です
確認はしていませんが、そこなら自由に読み書きができるはずです
こちらに詳しく説明が載ってます developer.android.com/training/data-storage?hl=ja
|
Re: 【Android】SDカード内のtxtファイルを読み込む方法 ( No.4 ) |
- 名前:Ikuzu 日時:2020/08/17 17:06
あいおい?さんありがとうございます。
試してみたところプライベートなファイルの置き場からtxtを読み込むことはできました。
共有スペースのファイルを読み込む場合はどうすればよいのでしょうか。
AndroidManifestに
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
を追加してやってみたのですができずませんでした。
設定が足りないのでしょうか?
|
Re: 【Android】SDカード内のtxtファイルを読み込む方法 ( No.5 ) |
- 名前:管理人 日時:2020/08/17 23:04
> SDカードと同じく内部ストレージも難しいのでしょうか?
あいおい?さんも仰られていますが、内部ストレージで且つ共有スペースでしたら容易にアクセスできます
GetExternalDataPath という関数で共有スペースのパスを取得できます
// ソフトの外部データ保存用のディレクトリパスを取得する
// PathBuffer : パスを保存するバッファ
// PathBufferBytes : パスを保存するバッファのサイズ( 単位:バイト )
// PathIndex : 外部データ保存用のディレクトリパスの番号( 複数個ある場合があるので )
// IsRemovableFlag : PathIndex で指定したパスが取り外し可能なデバイスかどうかを保存する int型変数のアドレス( 格納された値 TRUE:取り外し可能( SDカード等 ) FALSE:取り外し不可能( 内蔵ストレージ等 ) )
extern int GetExternalDataPath( char *PathBuffer, int PathBufferBytes, int PathIndex = 0, int *IsRemovableFlag = NULL ) ;
アプリが使用できる共有スペースの一覧を表示するプログラムを組んでみましたので、
よろしければお手元の環境で実行して、パスを確認してみてください m(_ _)m
#include "DxLib.h"
// プログラムは android_main から始まります
int android_main( void )
{
char PathBuffer[ 1024 ];
int IsRemovableFlag;
// 画面サイズを設定
SetGraphMode( 1280, 720, 32 );
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
{
return -1 ;
}
// フォントサイズを変更
SetFontSize( 24 );
// パスの数を取得
int DataPathNum = GetExternalDataPathNum();
// パスの数だけ繰り返し
for( int i = 0; i < DataPathNum; i++ )
{
// パスの取得
GetExternalDataPath(PathBuffer, sizeof(PathBuffer), i, &IsRemovableFlag);
// パスの描画
DrawString(0, i * 80, PathBuffer, GetColor(255, 255, 255));
// リムーバブルデバイスかを表示
DrawFormatString(0, i * 80 + 32, GetColor(255, 255, 255), "IsRemovableFlag : %d", IsRemovableFlag);
}
// キー入力待ち
WaitKey() ;
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
|
Re: 【Android】SDカード内のtxtファイルを読み込む方法 ( No.6 ) |
- 名前:Ikuzu 日時:2020/08/30 12:41
管理人さんありがとうございます。
プログラムを実行したところ
共有スペースからの読み込みは問題なくできました。
共有スペース以外、
例えば
/storage/emulated/0/test/test.txt
のようなファイルを読み込む場合はどういった方法になるのでしょうか。
|
Re: 【Android】SDカード内のtxtファイルを読み込む方法 ( No.7 ) |
- 名前:管理人 日時:2020/08/31 02:14
内部ストレージのデフォルトで許可されていないフォルダにアクセスするには
ストレージへのアクセス権限を得る必要があります
これは端末の設定画面『アプリと通知』などの画面からインストールしたアプリを選択して
権限を付与することもできますが、一般的にはアプリの中で
『機器内の写真、メディア、ファイルへのアクセスを○○〇に許可しますか?』
などの許可確認ダイアログを出して許可を求めるようになっています
そして、その処理は現状では Javaコードを使用しないといけないので、こちらに Javaコードを
使用して内部ストレージ内の標準では許可されていないフォルダへのファイルにアクセスする
ための手順をアップしましたので、よろしければご覧ください m(_ _)m
< DXライブラリ Android版を使用した Androidアプリで Java のコードでストレージ使用の権限をリクエストする >
https://dxlib.xsrv.jp/lecture/Android/Android_Java_Storage_AndroidStudio.html
↑こちらのサンプルプログラムに沿ってストレージへのアクセス権限を得ると、
/storage/emulated/0/test/test.txt
↑のようなファイルにも FileRead_open や fopen で読み込めるようになります( LoadGraph なども使えます )
あと、試しにSDカードの中のファイル( パスが /storage/0123-4567/Download だったりする )も読み込むことができました
ただ、SDカードのパスは端末によって異なったりするので、SDカードの中のファイルにアクセスする場合は No.5 で
私が載せたプログラムで使用している GetExternalDataPath で取得できるパスの中で IsRemovableFlag に TRUE が代入される
パスを SDカードであると判断して処理を組む、などの方法をとる必要があります
あと、私が試したのは Android 9 の端末で、Android 10 以降ではデフォルトでアクセスできるフォルダ以外の
フォルダへのアクセスが更に厳しくなっているらしいので、もしかしたら今回アップした方法は
Android 10 以降ではデフォルトでアクセスできるフォルダ以外のフォルダにアクセスできないかもしれません…
|