Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Escribir un archivo de acceso privado en el directorio de archivos de otra aplicación

Las dos aplicaciones tienen el mismo sharedUserId. Cuando uso este código en app1

context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE) 

Recibo una excepción diciéndome que el archivo contiene un separador de ruta.

Estoy tratando de escribir un archivo de app1 en el almacenamiento de la app2. (Por supuesto, tengo que asegurarse de que el directorio de archivos app2 existe en primer lugar)

Idealmente, escribiría a un directorio específico del usuario en vez de a un directorio específico de la aplicación, pero no sé si eso puede ser hecho

  • Android registerOnSharedPreferenceChangeListener () causa bloqueo en una vista personalizada
  • ¿Puede la biblioteca compartida llamar a otra biblioteca compartida?
  • Android Widget: muestra la actividad de configuración antes de que el widget se agregue a la pantalla.
  • Intentos de Android: Inicia la actividad usando el nombre de clase de otra aplicación que tiene el mismo sharedUserId
  • Transición de elementos compartidos de Android entre fragmentos con vista de reciclaje y detalles
  • SharedPreferences y seguridad de subprocesos
  • 4 Solutions collect form web for “Escribir un archivo de acceso privado en el directorio de archivos de otra aplicación”

    En primer lugar, NUNCA utilice una ruta de acceso completa al almacenamiento interno como /data/data . Deje que el sistema operativo le dé la ruta (por ejemplo, a través de Context.getFilesDir() o Environment.getExternalStorageState() ). No haga una suposición sobre dónde están los datos.

    En segundo lugar – ya está haciendo eso! A diferencia de File , Context.openFileOutput ya prepends /data/data/[package] a tu ruta, por lo que no es necesario especificarlo. Sólo tiene que especificar el nombre del archivo.

    Si realmente piensas que es seguro y necesario, y si ambas aplicaciones comparten la misma ID de usuario con android: sharedUserId en el manifiesto, puedes obtener un contexto de la otra aplicación usando Context.createPackageContext() y usar CONTEXT_RESTRICTED y usar openFileOutput Con sólo el nombre de archivo.

    Ya que esto es meses de edad supongo que ya has resuelto tu problema, pero voy a contribuir de todos modos.

    Para los usuarios de ContentProviders es necesario compartir datos entre aplicaciones. Suponiendo que sabe cómo escribir un ContentProvider y acceder a él, puede acceder a los archivos a través de ParcelFileDescriptor, que incluye constantes para el modo en el que se crean los archivos.

    Lo que necesita ahora es limitar el acceso para que no todo el mundo pueda leer los archivos a través del proveedor de contenido, y lo hace a través de los permisos de Android. En el manifiesto de uno de tus aplicaciones, el que hospedará los archivos y el proveedor de contenido, escribe algo como esto:

     <permission android:name="com.example.android.provider.ACCESS" android:protectionLevel="signature"/> 

    Y en ambas aplicaciones agregar esto:

     <uses-permission android:name="com.example.android.provider.ACCESS" /> 

    Mediante el uso de protectionLevel = "firma", sólo las aplicaciones firmadas por usted pueden acceder a su proveedor de contenido, y por lo tanto a sus archivos.

    Abra un FileOutputStream del archivo necesario, relativo a esta ruta de acceso:

     String filePath = getPackageManager(). getPackageInfo("com.your2ndApp.package", 0). applicationInfo.dataDir; 

    No debe sobrescribir otros archivos de aplicaciones. Dicho esto, usted tiene dos soluciones

    1. Utilice el almacenamiento externo público (como la tarjeta SD) para compartir el archivo entre las aplicaciones.
    2. Si la otra aplicación no es tuya, entonces no puedes escribir en su directorio / data, sin root. Cualquier cosa es posible con root, simplemente no espere que sus usuarios tengan acceso root.

    Editar: Desarrollador posee ambas aplicaciones

    Gracias por Roman Kurik por señalar esto. Un enlace a su puesto en SO

    Desde los documentos Android

    Android: sharedUserId

    El nombre de un ID de usuario de Linux que se compartirá con otras aplicaciones. De forma predeterminada, Android asigna a cada aplicación su propio ID de usuario único. Sin embargo, si este atributo se establece en el mismo valor para dos o más aplicaciones, todos compartirán el mismo ID, siempre que también estén firmados por el mismo certificado. La aplicación con el mismo ID de usuario puede acceder a los datos de los demás y, si se desea, ejecutarse en el mismo proceso.

    Así que esto es exactamente la forma en que el trabajo de id de usuario en linux, esencialmente usted es el propietario de ambos y tiene acceso de lectura / escritura a ambos.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.