اذهب إلى المحتوى

السؤال

نشر

السلام عليكم 

انا مبتدئة في البرمجة باستخدام الاندرويد ستوديو وقد بحثث مطولا عن كيفية الحصول على مسار الملف الذي تم اختياره في الهاتف باستعمال الكود التالي :

import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;

public class GetFilePathFromDevice {
    /**
     * Get file path from URI
     *
     * @param context context of Activity
     * @param uri     uri of file
     * @return path of given URI
     */

    @TargetApi(Build.VERSION_CODES.KITKAT)
    public static String getPath(final Context context, final Uri uri) {
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};
                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }

    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());

    }
}

 

ولكن هذا الكود وللاسف يرجع null  في حال اخترت ملف من الذاكرة الخارجية فارجو من لديه التعديل المناسب ان يقترحه وشكرا 

Recommended Posts

  • 0
نشر

مرحباً @Sameera Abubaker

يوجد العديد من الفنشكنز في الكود الخاص بك ,أين يتم إرجاع null ؟ إذا أمكن أرفاق الخطأ كامل الذي يظهر لك حتى أستطيع المساعدة يمكنك إرفاق ال LogCat هنا ,أو ذِكر ما نوع الملف الذي تريدين إختياره هل هو صورة ؟وأين موجود ذلك الملف هل في الذاكرة الخارجية أم الداخلية ؟

  • 0
نشر
بتاريخ 2 ساعات قال Mohamd Imran:

مرحباً @Sameera Abubaker

يوجد العديد من الفنشكنز في الكود الخاص بك ,أين يتم إرجاع null ؟ إذا أمكن أرفاق الخطأ كامل الذي يظهر لك حتى أستطيع المساعدة يمكنك إرفاق ال LogCat هنا ,أو ذِكر ما نوع الملف الذي تريدين إختياره هل هو صورة ؟وأين موجود ذلك الملف هل في الذاكرة الخارجية أم الداخلية ؟

باستخدم الدالة getPath وبمرر من خلالها uri للملف من الذاكرة الخارجية ايا كان نوعه

لمايكون من الصور او الفيدوهات او الصوت يعطي المسار كويس لكن لما نحدده من external storage وندخل على اي مجلد ونختار اي ملف يرجع null

  • 0
نشر
بتاريخ 17 ساعات قال Sameera Abubaker:

لمايكون من الصور او الفيدوهات او الصوت يعطي المسار كويس لكن لما نحدده من external storage وندخل على اي مجلد ونختار اي ملف يرجع null

اه تمام,يمكنك القيام بذلك ببساطة هكذا 

    // نقوم بعمل Uri من الملفات على الذاكرة الخارجية 
         File externalFile = new File(Environment.getExternalStorageDirectory(), "file.text");
         Uri external = Uri.fromFile(externalFile);

وأعلميني بالنتيجة 

  • 0
نشر
بتاريخ On 9/4/2020 at 08:26 قال Mohamd Imran:

اه تمام,يمكنك القيام بذلك ببساطة هكذا 


    // نقوم بعمل Uri من الملفات على الذاكرة الخارجية 
         File externalFile = new File(Environment.getExternalStorageDirectory(), "file.text");
         Uri external = Uri.fromFile(externalFile);

وأعلميني بالنتيجة 

اين نضيف هذا الكود ؟؟؟
للاسف انا مبتدأة في الاندرويد ستوديو

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...