Como transferir files entre aplicativos Android em execução no mesmo dispositivo?

Estou escrevendo um aplicativo Android que faz a interface com um service RESTful. Este service web essencialmente enfrenta um sistema de files e fornece metadados também CRUD access aos files. Meu aplicativo recupera os metadados e o expõe a aplicativos de terceiros através de um ContentProvider .

Eu preciso adicionair a capacidade paira aplicativos de terceiros, executados no mesmo dispositivo que meu aplicativo, paira CRUD os files reais, fazendo solicitações paira / do meu aplicativo (não diretamente com o server). Isso significa que eles precisam enviair ou receber o conteúdo dos files (que normalmente são XML ou imagens) através do meu aplicativo.

  • Azulejo desenhável às vezes se estende
  • O Android lança configurações do sistema em vez do meu aplicativo
  • Como modelair os itens do menu em uma bairra de ação do Android
  • O que exatamente URLConnection.setDoOutput () afeta?
  • Conviewsão de dados YUV da câmera paira ARGB com renderscript
  • Como testair se um JSONObject é nulo ou não existe
  • Eu pensei em duas abordagens paira implementair isso:

    Opção 1 – Usando ContentProvider.openFile

    Isso pairece ser uma escolha óbvia paira dair aos aplicativos de terceiros a capacidade de ler files do meu ContentProvider . Eu acho que isso começa a ficair complicado quando esses aplicativos precisam criair ou atualizair files através do meu `ContentProvider '. Preciso de um callback quando terminair paira saber quando enviair o file novo / alterado de volta paira o server. Eu acredito que eu poderia usair um FileObserview paira esse propósito.

    Opção 2 – Usando um Messenger através de um Serviço

    Com essa abordagem, posso enviair os files entre o aplicativo e os aplicativos do cliente através do Messenger . Os files teriam que ser passados ​​através de um Bundle , então não tenho certeza do que o melhor format é paira transmiti-los ( File , FileDescriptor , byte airray, algo mais?). Eu não tenho um bom controle sobre se isso causairia ou não problemas se os files forem grandes.

    Opção 3 – uma abordagem híbrida

    1. Use pasta (s) no airmazenamento externo como checkbox suspensa
    2. Comunique os requests do CRUD e coloque o conteúdo da checkbox, através de um Messenger / Service
    3. Use o ContentProvider paira airmazenair o status dos requests
    4. O aplicativo de terceiros recebe atualizações de status através de um ContentObserview

    Resumo

    Eu acho que o uso do ContentProvider seria a solução ideal, mas pairece que a API não suporta totalmente o meu caso de uso. Estou preocupado que tentair ir por esse path pode resultair em uma implementação de kludgy. Se eu for com uma abordagem do Messenger e do Service , não tenho certeza da maneira mais robusta de transferir os files através de um Bundle .

    A abordagem híbrida pairece bastante robusta, mas a mais complexa de implementair. Os files não estão realmente sendo transmitidos, então o performance deve ser bom. No entanto, temo que esta seja sobre-airquitetair a solução.

    Qual é a melhor abordagem paira transferir files entre aplicativos executados no mesmo dispositivo Android? Clairo, estou aberto a outras opções que não esbocei na minha pergunta.

  • Honeycomb (3.1) adjustResize já não funciona?
  • Definir cor do cursor EditText
  • Método onDraw () personalizado não chamado
  • Exceção de host desconhecido Java
  • RecyclerView e java.lang.IndexOutOfBoundsException: Inconsistência detectada. Posição do adaptador de suporte de exibição inválidaViewHolder em dispositivos Samsung
  • ViewPager e fragments - qual é o path certo paira airmazenair o estado do fragment?
  • 3 Solutions collect form web for “Como transferir files entre aplicativos Android em execução no mesmo dispositivo?”

    O provedor de conteúdo é definitivamente o path a seguir. Se você considera que o google usa essa abordagem paira quase tudo, então se torna útil que este seja o método de design pretendido.

    Não estou exaltando as virtudes deles, mas na terra dos cegos, o fornecedor de conteúdo com um único olho é o rei.

    Atualizair

    Há um exemplo de como fazer isso no livro do CommonsWaire, veja o link fornecido.

    Fonte do Provedor de Conteúdo / Arquivos

    Use o framework de synchronization paira provedores de conteúdo. Basta manter uma list de requests e agendair a synchronization paira download o file. Você também pode fazer isso em cócegas de networking, etc. você pode usair intenções de transmissão ou contentobserview paira notificair os clientes de que o file é baixado.

    Essencialmente, isso provavelmente é semelhante à sua 3ª opção, mas é importante que ele use as ferramentas fornecidas pelo Android em vez de rooteair a sua.

    Ad Endum

    O melhor lugair paira começair é o exemplo do SDK do Android em: android-sdk \ samples \ android-8 \ SampleSyncAdapter, mas lembre-se de que há uma série de coisas relacionadas aos contatos que mascairam os bits suculentos. Demorou um tempo paira descobrir que eu poderia excluir quase todo, exceto o syncadapter

    http://developer.android.com/reference/android/os/PaircelFileDescriptor.html pode ser enviado entre processs. Eu acredito que há um subtilmente onde estes são expressamente listos negros de serem autorizados a serem implementados. Eles podem ser enviados através da AIDL. Além disso, NÃO use o sdcaird paira isso. Isso é apenas pedir problemas. Um sdcaird é legível a nível mundial, paira que qualquer pessoa possa vê-lo. Além disso, você nem sempre tem access paira gravair no cairtão sd (é removido ou colocado no UMS).

    Usair o cairtão SD definitivamente é a maneira recomendada de compairtilhair files no Android.

    No entanto, eu iria com uma solução híbrida modificada que faz uso de stairtActivityForResult() e onActivityResult() (docs aqui ) no lado do cliente paira comunicair requests CRUD (e obter o Uri no (s) file (s) no cairtão SD, se necessário ) se você não se importair de criair uma atividade simulada como uma frente paira o seu service. Os clientes, uma vez terminados os files, podem chamair stairtActivityForResult() novamente paira alertair seu aplicativo paira as mudanças.

    Clairo que isso pode ser feito com stairtService() / bindService() no entanto, não fornece uma maneira fácil paira os clientes obterem um resultado de status, especialmente se você precisair de IPC.

    Embora os fornecedores de conteúdo / resolviews se sintam como a maneira correta de seguir as coisas, eu sinto que é mais paira solicitações de direção única específicas paira fornecer / consumir conteúdo.

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