6
votes

Android 7 Nougat, comment obtenir le chemin du fichier de Uri de l'intention entrante?

FileProvider: - Configuration du partage de fichiers

Je sais que modifier la stratégie de fichier dans Android Nougat. L'application souhaitée que le fichier partage sur d'autres applications génère l'URI par FileProvider. Le format URI est contenu: //com.example.myapp.fileprovider/myimages/default_image.jpg .

Je veux savoir que puis-je obtenir de l'URI de l'URI générant par FileProvider.GetTuriforFile () . Parce que l'application est nécessaire de connaître le filépathie physique afin de sauvegarder, charger, readinfo, etc. est-ce possible

[en bref]

  1. Mon application a reçu l'intention URI par d'autres applications sur Andorid 7 Nougat.
  2. Le format URI est contenu: //com.example.myapp.fileprovider/myimages/default_image.jpg
  3. peut-être qu'il a été généré par fileprovider.geturiforfile .
  4. Je veux savoir comment obtenir le chemin du fichier de Uri.
  5. Je peux simplement obtenir le type MIME, le nom d'affichage, la taille de fichier et lire binay à partir de getcontentreSolver (). OpenFileDedescriptor () . Mais je veux connaître le fichier FilePath.

3 commentaires

Vous pouvez lire dans le flux si vous pouvez lire binaires à partir du flux. Utilise le. Il n'y a pas besoin d'un chemin de fichier. Seul le fournisseur de fichiers doit pouvoir vous dire le chemin de fichier, mais il n'y a pas. Repenser. Refonte. Vous n'avez pas besoin d'un chemin de fichier.


"L'application est nécessaire de connaître le filépathie physique afin de sauvegarder, charger, readinfo, etc." - Ensuite, faites votre propre copie du contenu, en utilisant contentResolver et openinpiptream () . Non seulement vous ne pouvez pas déterminer le chemin, mais même si vous le pouviez, il est assez probable que vous n'ayez aucun accès au système de fichiers à ce fichier.


Avez-vous trouvé une solution?


3 Réponses :


4
votes

Vous ne pouvez pas obtenir de "chemin de fichier" pour une URI, pour la simple raison qu'il n'y a aucune obligation qu'un URI pointera vers un fichier. Utilisez contentResolver et méthodes telles que OpenInputStream () pour accéder au contenu représenté par l'URI.

Pour partager un fichier avec une autre application à l'aide d'une URI de contenu, votre application doit générer l'URI du contenu. Pour générer l'URI du contenu, créez un nouveau Fichier pour le fichier, puis transmettez le fichier à Greturiforfile (). Vous pouvez envoyer L'URI de contenu est retourné par Greturiforfile () à une autre application dans un Intention. L'application client qui reçoit l'URI de contenu peut ouvrir le fichier et accéder à son contenu en appelant contentesolver.openfiledescriptor Pour obtenir un Parcelfiledescriptor. Source: Développeurs Android


2 commentaires

Pour partager un fichier avec une autre application à l'aide d'un contenu URI, votre application doit Implémenter un fichier FileProvider.


Et si je joue au fichier vidéo à l'aide de Native Library (C ++ ne connaît rien sur le contenu URI, il a besoin d'un chemin absolu)? Je choisis un fichier vidéo à partir d'une application exploratrice et essayez de l'ouvrir mon application vidéo



0
votes

J'ai eu l'exigence similaire dans notre application et que je me suis confondu plus tôt. J'ai résolu de cette façon.

dans Android N, seul le fichier URI exposé à une application tierce est modifié. (Pas la façon dont nous l'utilisions avant).

Dans notre application, nous envoyions une application URI à la caméra, à cet endroit, nous nous attendons à l'application de la caméra pour stocker l'image capturée.

  1. pour Android N, nous génèverons un nouveau contenu: // URL basé sur URI pointant vers déposer.
  2. Nous générons un chemin d'accès d'API de fichier habituel pour la même (utilisation de la méthode plus ancienne).

    Nous avons maintenant 2 URI différentes pour le même fichier. # 1 est partagé avec l'application de la caméra. Si l'intention de la caméra est réussie, nous pouvons accéder à l'image de # 2.

    J'espère que cela aide.


0 commentaires

1
votes
// Use Below Method Working fine for Android N.
private static String getFilePathForN(Uri uri, Context context) {
    Uri returnUri = uri;
    Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);
    /*
     * Get the column indexes of the data in the Cursor,
     *     * move to the first row in the Cursor, get the data,
     *     * and display it.
     * */
    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
    returnCursor.moveToFirst();
    String name = (returnCursor.getString(nameIndex));
    String size = (Long.toString(returnCursor.getLong(sizeIndex)));
    File file = new File(context.getFilesDir(), name);
    try {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        FileOutputStream outputStream = new FileOutputStream(file);
        int read = 0;
        int maxBufferSize = 1 * 1024 * 1024;
        int bytesAvailable = inputStream.available();

        //int bufferSize = 1024;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);

        final byte[] buffers = new byte[bufferSize];
        while ((read = inputStream.read(buffers)) != -1) {
            outputStream.write(buffers, 0, read);
        }
        Log.e("File Size", "Size " + file.length());
        inputStream.close();
        outputStream.close();
        Log.e("File Path", "Path " + file.getPath());

    } catch (Exception e) {
        Log.e("Exception", e.getMessage());
    }
    return file.getPath();
}

2 commentaires

Méthode ci-dessus travaillant dans Android n. Vous obtiendrez le chemin du fichier contentResolver () et utilisez le fournisseur de fichiers dans le fichier Manifext Android ainsi que lire et écrire une autorisation de stockage externe. Méthode ci-dessus, appelez simplement sur OnActivityResult où les données URI Obtenez et appellez simplement Stress Strpath = GetFilePathForn (URI, Ceci);


S'il vous plaît mettre votre réponse toujours dans le contexte au lieu de simplement coller du code. Voir ici pour plus de détails.