J'ai intégré le Creative Kit de Snapchat dans mon Android. Après le traitement, je reçois une image du serveur sous la forme d'un tableau d'octets que j'enregistre sur le disque puis envoie le fichier à la Kit créatif de Snapchat comme indiqué ci-dessous.
private fun downloadImage(
fileName: String,
imageByteArray: ByteArray?): Uri? {
val state = Environment.getExternalStorageState()
if (Environment.MEDIA_MOUNTED == state) {
val downloadDir = File(
Environment.getExternalStorageDirectory(), context?.getString(R.string.app_name)
)
if (!downloadDir.isDirectory) {
downloadDir.mkdirs()
}
val file = File(downloadDir, fileName)
var ostream: FileOutputStream? = null
try {
ostream = FileOutputStream(file)
ostream.write(imageByteArray)
ostream.flush()
ostream.close()
}
} catch (e: IOException) {
e.printStackTrace()
}
val snapCreativeKitApi = SnapCreative.getApi(context!!)
val snapMediaFactory = SnapCreative.getMediaFactory(context!!)
lateinit var snapPhotoFile: SnapPhotoFile
try {
snapPhotoFile = snapMediaFactory.getSnapPhotoFromFile(file)
} catch (e: SnapMediaSizeException) {
return
}
val snapPhotoContent = SnapPhotoContent(snapPhotoFile)
snapCreativeKitApi.send(snapPhotoContent)
}
}
J'ai également ajouté provider
dans le fichier manifeste comme indiqué ci-dessous:
<provider
Android:name="androidx.core.content.FileProvider"
Android:authorities="${applicationId}.provider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/provider_paths_app" />
</provider>
Et dans le provider_paths_app.xml
, J'ai essayé tous les chemins possibles en faisant référence à this réponse et aucun d'eux ne fonctionne.
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
<external-path
name="My App Name"
path="." />
</paths>
Avec le chemin ci-dessus, j'obtiens l'erreur ci-dessous.
Couldn't find meta-data for provider with authority my.package.name.fileprovider
Tout ce que je dois faire est d'envoyer cette image à Snapchat mais je ne peux pas comprendre ce que je fais mal. Toute aide serait appréciée.
<provider
Android:name="androidx.core.content.FileProvider"
Android:authorities="${applicationId}.fileprovider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/file_paths"></meta-data>
</provider>
Ceci est ma déclaration de fournisseur, la valeur de $ {applicationId} est "com.limxtop.research", assurez-vous que le nom des autorités est le même que celui des codes ci-dessous.
// Create the file where the photo should save.
File file = null;
try {
file = createImageFile();
} catch (IOException e) {
break;
}
// The second parameter is the name of authorities.
Uri uri = FileProvider.getUriForFile(this,
"com.limxtop.research.fileprovider", file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, fullSizeRequestCode);
Donc, peut-être que vos codes postés ici ne sont pas complets, vous devriez passer "my.package.name.fileprovider" comme paramètre quelque part.
Écrivez d'abord la balise suivante dans le manifeste sous la balise
<provider
Android:name="androidx.core.content.FileProvider"
Android:authorities="${applicationId}.provider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/provider_paths" />
</provider>
Ensuite, créez un dossier xml dans res et créez un nom de fichier: fournissez + paths.xml puis copiez collez le code:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
<external-path
name="external_files"
path="." />
</paths>
et maintenant la plupart des erreurs de développeur dans les programmes pour créer un fichier dans le programme, nous allons utiliser:
FileProvider.getUriForFile(Objects.requireNonNull(getApplicationContext()),
BuildConfig.APPLICATION_ID + ".provider", file);
J'espère que cela fonctionnera pour vous !!!
Je viens de supprimer le '$' d'Android: autorités = "$ {applicationId} .provider" et cela fonctionne comme un charme maintenant.
mImageFromCamera = FileProvider.getUriForFile (this, BuildConfig.APPLICATION_ID + ".fileprovider", mImageFile); Android: autorités = "$ {applicationId} .fileprovider"
les autorités doivent être identiques en xml et en code
Remplacez les autorités par un nom unique pour résoudre le problème, comme
Android:authorities="${applicationId}.myUniquefileprovider"
également en Java
Dans mon cas.
J'ai un projet de bibliothèque. Appelons-le: LibApk
Quand je code ceci: applicationId "my.package.name" dans le build.grale (app)
quand build gradle me dit que: Les projets de bibliothèque ne peuvent pas définir applicationId. applicationId est défini sur 'com.darcy.apkupdate' dans la configuration par défaut.
Donc, je supprime applicationId "my.package.name".
Ensuite, build.gradle ressemble à ceci:
Mais j'ai oublié de mettre à jour le fichier AndroidManifest.xml qui utilise $ {applicationId}
C'est le problème!!!
J'ai donc changé la variable en constante. Le résultat ressemble à l'image ci-dessous:
Après ça, c'est wokr pour moi!
J'espère que cela vous aidera ...