新規作成ファイルのパーミッションについて

2,247 views
Skip to first unread message

zhangho

unread,
Jul 1, 2009, 11:49:31 PM7/1/09
to Android-SDK-Japan
ファイルマネジャーの一部機能実装していますけど
/sdcardの画像をコピーした場合
―-rw-rw- system system 310862 2009-04-17 23:30 1239978643996.jpg
のものがFileInputStream、FileOutputStream、でコピーされて

たとえば/data/wwwフォルダに移動するとパーミッションが変わって下記のようになりますね。(-rw――-)
-rw――- app_54 app_54 307803 2009-07-01 19:22 1239978904726.jpg

これをイメージビューアで開くと画像が表示されない。
chown 066してみてもパーミッションが変わらない。

なにかいい方法がありますか?

nagamatu

unread,
Jul 2, 2009, 11:32:31 AM7/2/09
to Android-SDK-Japan
android.Context.openFileOutputを使うと、modeに MODE_WORLD_READABLEを指定する事で全ての他
のアプリケーションからの読み出しが可能となります。

http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,%20int)

--
ながまつ

On 7月2日, 午後12:49, zhangho <cui.chang...@gmail.com> wrote:
> ファイルマネジャーの一部機能実装していますけど
> /sdcardの画像をコピーした場合
> ---rw-rw- system system 310862 2009-04-17 23:30 1239978643996.jpg
> のものがFileInputStream、FileOutputStream、でコピーされて
>
> たとえば/data/wwwフォルダに移動するとパーミッションが変わって下記のようになりますね。(-rw-----)
> -rw----- app_54 app_54 307803 2009-07-01 19:22 1239978904726.jpg
>
> これをイメージビューアで開くと画像が表示されない。
> chown 066してみてもパーミッションが変わらない。
>
> なにかいい方法がありますか?
Message has been deleted
Message has been deleted

zhangho

unread,
Jul 2, 2009, 11:21:26 PM7/2/09
to Android-SDK-Japan
> android.Context.openFileOutputを使うと、modeに MODE_WORLD_READABLEを指定する事で全ての他

ありがとうございます。
Context.openFileOutputは基本的に/data/data/<package>/files の直下しか作成できないですね。
たとえば/data/data/<package>/wwwとかにコピーしようとする場合はFileOutputStreamでするしかないですが

sdcardの画像をにFileOutputStreamでコピーしたら
パーミッションが -rw――-になっています。

さらに下記の方法でパーミッションを与えても画像が開けない。
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType(Uri.fromFile(f), filetype);
startActivity(intent);

手動でパーミッションを -rw――-から―-rw-rw-に変更したら開けました。

FLAG_GRANT_READ_URI_PERMISSIONも駄目なのでなにかいい方法が無いでしょうか?

Hiroshi Ichikawa

unread,
Jul 4, 2009, 12:41:13 AM7/4/09
to android-...@googlegroups.com
裏技的ですが、以下のexecメソッドを使って
exec("/system/bin/chmod", "744", "/data/data/net.gimite.nativeexe/a.out");
とすることでパーミッションを744にすることができたので、この方法でいけるかもしれません。

// Executes UNIX command.
private String exec(String arg0, String arg1, String arg2) {
try {
// android.os.Exec is not included in android.jar so we
need to use reflection.
Class<?> execClass = Class.forName("android.os.Exec");
Method createSubprocess = execClass.getMethod("createSubprocess",
String.class, String.class, String.class, int[].class);
Method waitFor = execClass.getMethod("waitFor", int.class);

// Executes the command.
// NOTE: createSubprocess() is asynchronous.
int[] pid = new int[1];
FileDescriptor fd = (FileDescriptor)createSubprocess.invoke(
null, arg0, arg1, arg2, pid);

// Reads stdout.
// NOTE: You can write to stdin of the command using new
FileOutputStream(fd).
FileInputStream in = new FileInputStream(fd);
BufferedReader reader = new BufferedReader(new
InputStreamReader(in));
String output = "";
try {
String line;
while ((line = reader.readLine()) != null) {
output += line + "\n";
}
} catch (IOException e) {
// It seems IOException is thrown when it reaches EOF.
}

// Waits for the command to finish.
waitFor.invoke(null, pid[0]);

return output;
} catch (ClassNotFoundException e) {
throw new RuntimeException(e.getMessage());
} catch (SecurityException e) {
throw new RuntimeException(e.getMessage());
} catch (NoSuchMethodException e) {
throw new RuntimeException(e.getMessage());
} catch (IllegalArgumentException e) {
throw new RuntimeException(e.getMessage());
} catch (IllegalAccessException e) {
throw new RuntimeException(e.getMessage());
} catch (InvocationTargetException e) {
throw new RuntimeException(e.getMessage());
}
}

ref. http://gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App

2009/07/03 12:21 に zhangho<cui.ch...@gmail.com> さんは書きました:
>
>> android.Context.openFileOutputを使うと、modeに MODE_WORLD_READABLEを指定する事で全ての他
>
> ありがとうございます。
> Context.openFileOutputは基本的に/data/data/<package>/files の直下しか作成できないですね。
> たとえば/data/data/<package>/wwwとかにコピーしようとする場合はFileOutputStreamでするしかないですが
>
> sdcardの画像をにFileOutputStreamでコピーしたら
> パーミッションが -rw-----になっています。
>
> さらに下記の方法でパーミッションを与えても画像が開けない。
> intent.setAction(Intent.ACTION_VIEW);
> intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
> intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
> intent.setDataAndType(Uri.fromFile(f), filetype);
> startActivity(intent);
>
> 手動でパーミッションを -rw-----から---rw-rw-に変更したら開けました。
>
> FLAG_GRANT_READ_URI_PERMISSIONも駄目なのでなにかいい方法が無いでしょうか?
>
>
> >
>

zhangho

unread,
Jul 5, 2009, 9:24:27 PM7/5/09
to Android-SDK-Japan
ichigawaさん、ありがとうございます。

>exec("/system/bin/chmod", "744", "/data/data/net.gimite.nativeexe/
a.out");

これは僕もAndroid Developer Phoneでは出来ますが、

Google Developer Dayでもらった携帯ではできないです。

正式アプリでは システムコマンドは使わないほうがいいじゃないかと思います。



Hiroshi Ichikawa

unread,
Jul 6, 2009, 7:33:34 AM7/6/09
to android-...@googlegroups.com
なるほど、そうなんですか。情報ありがとうございます。

2009/07/06 10:24 に zhangho<cui.ch...@gmail.com> さんは書きました:

Daisuke Miyakawa

unread,
Jul 6, 2009, 11:58:38 PM7/6/09
to android-...@googlegroups.com
宮川です。

いわゆる GDD phone は、もらった時点ではルート権限が取れないシェルだった気がします。それがパーミッションを変えられない理由じゃないかと思います。

参考まで。

2009/07/06 20:33 に Hiroshi Ichikawa<gim...@gmail.com> さんは書きました:
--
Daisuke Miyakawa (宮川大輔)
d.miy...@gmail.com

Hiroshi Ichikawa

unread,
Jul 7, 2009, 8:12:05 PM7/7/09
to android-...@googlegroups.com
2009/07/07 12:58 に Daisuke Miyakawa<d.miy...@gmail.com> さんは書きました:
>
> 宮川です。
>
> いわゆる GDD phone は、もらった時点ではルート権限が取れないシェルだった気がします。それがパーミッションを変えられない理由じゃないかと思います。

この方法を使った場合、コマンドはアプリケーションのユーザの権限で動くので、どのみちrootではないのですが、ファイルのオーナーも同じユーザなので(自分が作ったファイルだから)、(手元の環境では)うまく行ってるんだと思います。GDD
phoneにはchmodコマンドがないんですかね。

zhangho

unread,
Jul 10, 2009, 7:12:07 AM7/10/09
to Android-SDK-Japan
>正式アプリでは システムコマンドは使わないほうがいいじゃないかと思います。

うそついたかも知れません。

本番機でもroot権限がなくても実行できますね。
Reply all
Reply to author
Forward
0 new messages