ここから本文です

回答受付終了まであとわずか 回答を投稿すると知恵コイン15枚が追加されます

【androidアプリ開発】assets または res/rawのパスの取得方法は?

rit********さん

2018/8/822:46:03

【androidアプリ開発】assets または res/rawのパスの取得方法は?

android studioでアプリ開発をしています。
assetsまたは res/eawに appRestert.shというファイルを含めて、
MainActivity.javaの中で

"/bin/sh ***/appRestert.sh &"

みたいなものを実行したいのですが、***のディレクトリ名の取得方法が分かりません。

どなたか、よろしくお願い致します。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしています。

(ほかの方からの回答を制限するものではありません)

閲覧数:
29
回答数:
3
お礼:
500枚

違反報告

回答投稿

全角1文字以上で回答を入力してください。

※質問が「投票受付中」「解決済み」になると、回答を取り消すことはできません。
※一度に投稿できるURLは3つ以内です。(プレミアム会員・知恵袋アプリは除く)

エラーが発生しました。お手数ですが、時間をおいて再度お試しください。

あと全角4000文字

回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

rp0********さん

リクエストマッチ

2018/8/1002:08:45

assetsはアプリビルド時にバイナリデータになるので、
ファイルパスの取得方法はありません。
なので、参照できるように、assetからコピーファイルを作成します。
※assetにDBファイルを入れておき、初回起動時にアプリ内にDBのコピーを作る方法はよくある手法で、この応用になります。

すでに回答がある通り、
「AssetManager#open("ファイル名")」を実行すると
ネイティブ層でassetに保存していたファイルのファイルディスクリプタを取得、java層でInputStreamクラスを経由してファイルの中身を見ることができます。
あとは、参照データを自アプリ内のファイルに保存することで
目的のものをファイルとして得ることができますね。
ディレクトリのパスはContext#getFilesDir()で得られます。

あと、「/bin/sh」ではなく「/system/bin/sh」だったはず。。
なので、コマンドは以下になるかな。
ProcessBuilder pb = new ProcessBuilder("/system/bin/sh", getFilesDir() +"/appRestert.sh");

"/system/bin/sh"は単純に「"sh"」だけでも可能だと思います。
shコマンドは、パーミッションが「755」だったので、アプリからでも実行可能
※確認端末「Galaxy Note8(SCV37) Android8.0」
javaによるLinuxコマンド実行は、ProcessBuilderやRuntime#exec()を使いますが、別プロセスでの実行になります。ですが、UIDやGIDはアプリと同じなので、コピーしたファイルも参照可能だと思います。

あとは
「appRestert.sh」という怪しげなスクリプトが、
はたしてAndroidで実行可能なコマンドなのか。。

プロフィール画像

カテゴリマスター

ikt********さん

2018/8/908:13:02

あきらめたほうがいいんじゃないかな。

1.
assets/ や res/raw/ に置いたファイルは、
apk の内蔵物。
apk がインストールされたAndroid端末内の
どっかに、あなたのStudioで見えるまんまのファイル名で、
独立ファイル として置かれるわけじゃないはず。

既にご回答あるように、専用に用意されたopen手段を
使ったり、専用スキーム指定したUriでアクセスしたり
しないと、そもそも中味を読み出せない。

2.
/bin/sh でスクリプト実行しようとすること自体が、
たぶん無理なんじゃないかな。
少なくとも市販端末では。

最近のAndroid端末は SELinux 使ったセキュリティ保護
かけられてる。
apkがアクセスできるファイルシステム領域は
限定されてるし、あなたのapkから sh を Runtime.exec
すること自体も非許容(エラーにされる)んじゃないかと
思います。

プロフィール画像

カテゴリマスター

yuk********さん

リクエストマッチ

2018/8/905:42:52

>***のディレクトリ名の取得方法

Assets、res/rawからリソースを取り出す場合にはpathを指定することはありません

Assets:
例えばAssetsにあるimg.jpgを取り出す場合に InputStream と getAssets().open() を使いtry...cathで取得します

try(InputStream istream = getResources().getAssets().open("img.jpg");){
Bitmap bitmap = BitmapFactory.decodeStream(istream);
...
} catch (IOException e) {
e.printStackTrace();
}
参考:
https://akira-watson.com/android/imageview.html

またres/rawからの取り出す場合ですが
通常ここにはメディア系のファイルになります

music.mp3 ファイルを入れると

MdediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.music);

のように、通常resourceから取り出すようにid(R.raw.music)を指定します
参考:
https://akira-watson.com/android/audio-player.html

このカテゴリの投票受付中の質問

一覧を見る

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる