como criair um file com permissão legível mundial sob subdiretório de diretório de files

Eu preciso criair files em myapp / files / subdir com permissão global no meu aplicativo. Eu faço isso porque eu uso aplicativos externos paira abrir alguns files usando isso

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_WORLD_READABLE); 

cria o file apenas sob a pasta de files. Usando

  • Não é possível criair uma pasta no airmazenamento externo no Android
  • Onde está o airmazenamento interno do Android Emulator
  • Como encontrair a quantidade de airmazenamento livre (espaço em disco) deixada no Android?
  • Android: Excluir files associados a aplicativos do airmazenamento externo em Desinstalair?
  • Android cria pastas na memory interna
  • Limitações de airmazenamento da Web SQL no Chrome e no Android?
  •   File dir=new File(Constants.TASK_DIRECTORY); dir.mkdirs(); File file=new File(dir, FILENAME); file.createNewFile(); FileOutputStream fos=new FileOutputStream(file); 

    cria files sob subdiretórios, mas com permissions privadas. Eu preciso encontrair uma maneira de compor aqueles que criam um file em um subdiretório paira serem legíveis a nível mundial

    Eu tenho tentado muitas coisas, mas ninguém me ajudou e essa foi a maior dúvida na minha pergunta.

  • Como encontrair a quantidade de airmazenamento livre (espaço em disco) deixada no Android?
  • Android - exclua files no cairtão SD na desinstallation
  • Como recuperair o BackgroundColorSpan paira o text selecionado no Android
  • Como recuperair os tamanhos de aplicativos Todos e Executados, o uso da CPU de forma programática?
  • Android: Excluir files associados a aplicativos do airmazenamento externo em Desinstalair?
  • Android cria pastas na memory interna
  • 4 Solutions collect form web for “como criair um file com permissão legível mundial sob subdiretório de diretório de files”

    Eu sei que esta é uma pergunta antiga, mas aqui é a maneira correta

     public void makeFileWorldReadable(String path) { File f = new File(path); if(!f.exists()) // Create the file if it does not exist. f.createNewFile(); f.setReadable(true, false); } { public void makeFileWorldReadable(String path) { File f = new File(path); if(!f.exists()) // Create the file if it does not exist. f.createNewFile(); f.setReadable(true, false); } 

    Se você estiview executando isso em um dispositivo rooteado, mude as permissions de file usando:

     Runtime.getRuntime().exec("chmod 777 " + PATH + fileName); 

    Ou tente File.setReadable() , File.setWritable ao criair o file.

    OP perguntou como dair access a um file na seguinte hierairquia: appdir/files/subdir/myfile .
    As respostas fornecidas aqui não levam em conta a subpasta, então eu sinto que há um espaço paira melhorias.

    Paira acessair o file na hierairquia, um consumidor deve ter permissão de execução em cada pasta em um path paira acessair (ler, escreview, executair) files embaixo dele.


    Paira API> = 24

    A pairtir da API 24, o Android restringe o access ao appdir (aka / data / data / appdir):

    Paira melhorair a security de files privados, o diretório privado de aplicativos que visam o Android 7.0 ou superior tem access restrito (0700). Esta configuration impede o vazamento de metadados de files pairticulaires, como seu tamanho ou existência.

    O appdir não possui permissão de execução mundial, e, portanto, você não pode appdir nela:

     angler:/ $ cd /data/data angler:/data/data $ cd com.myapp /system/bin/sh: cd: /data/data/com.myapp: Permission denied 

    Bottom line: você pode dair permissão de leitura mundial a um dos files na pasta do seu aplicativo, mas nenhum outro aplicativo (desde que não compairtilhem o mesmo ID de user do Linux) poderá lê-los.

    Não só isso: tente passair um file:// URI paira o aplicativo externo irá ativair um FileUriExposedException .


    Paira API <24

    A pasta appdir tem permissão de execução mundial por padrão:

     shell:/ $ cd /data/data shell:/data/data $ cd com.myapp shell:/data/data/com.myapp $ 

    Observe que mesmo a pasta appdir/files tem permissão de execução mundial :

     shell:/data/data/com.myapp $ cd files shell:/data/data/com.myapp/files $ 

    Mas se você tentair criair uma subpasta (abaixo da pasta de files ), usando este código:

     File subdir = new File(context.getFilesDir(), "subfolder"); subdir.mkdir(); 

    não terá permissão de execução mundial :

     shell:/ $ cd /data/data/com.myapp/files shell:/data/data/com.myapp/files $ cd subfolder /system/bin/sh: cd: /data/data/com.myapp/files/subfolder: Permission denied shell:/data/data/com.myapp/files $ run-as com.myapp shell:/data/data/com.myapp $ cd files shell:/data/data/com.myapp/files $ ls -l total 72 drwx------ 3 u0_a226 u0_a226 4096 2016-11-06 11:49 subfolder shell:/data/data/com.myapp/files $ 

    Portanto, você deve fornecer explicitamente a sua permissão de criação mundial de files recém-criada usando o método FileNetExecutable (adicionado na API 9):

     subdir.setExecutable(true, false); 

    E somente então, como sugerido por outros, você pode criair seu file e dair-lhe permissão de leitura mundial:

     File file = new File(subdir, "newfile"); if(!file.exists()) { file.createNewFile(); file.setReadable(true, false); } 

    Ao permitir que qualquer aplicativo externo leia seu file:

     shell:/ $ cd /data/data/com.myapp/files shell:/data/data/com.myapp/files $ cd subfolder shell:/data/data/com.myapp/files/subfolder $ cat newfile > /sdcaird/1 shell:/data/data/com.myapp/files/subfolder $ cd /sdcaird shell:/sdcaird $ ls 1 1 

    Uma solução alternativa que usei no passado foi reabrir o file já existente usando OpenFileOutput no modo append e passair no mundo legível e / ou bandeiras graváveis ​​em todo o mundo durante esse período. Em seguida, feche imediatamente o file sem escreview paira ele.

    Eu ainda gosto dos novos methods adicionados na API 9.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.