java - Android-احصل على المسار الحقيقي لملف.txt محدد من مستكشف الملفات




file android-activity (2)

لم أجد كيف يمكنني الحصول على الملف من أوري.

لا يوجد ملف ACTION_OPEN_DOCUMENT و ACTION_GET_CONTENT لا تفتح ملفًا. يفتحون وثيقة. قد يكون هذا المستند ملفًا. قد لا. قد يشير Uri إلى:

  • ملف محلي على وحدة التخزين الخارجية
  • ملف محلي على وحدة التخزين الداخلية للتطبيق الآخر
  • ملف محلي على التخزين القابل للإزالة
  • ملف محلي مشفر ويحتاج إلى فك تشفيره سريعًا
  • دفق من وحدات البايت المحفوظة في عمود BLOB في قاعدة بيانات
  • جزء من المحتوى يحتاج إلى تنزيله من قبل التطبيق الآخر أولاً
  • ...وما إلى ذلك وهلم جرا

كيف يمكنني الحصول على المسار الحقيقي للملف؟

أنت لا تفعل ذلك.

إذا كنت ترغب في قبول الملفات فقط ، ACTION_OPEN_DOCUMENT ACTION_GET_CONTENT مكتبة منتقي الملفات بدلاً من استخدام ACTION_OPEN_DOCUMENT أو ACTION_GET_CONTENT . فقط ضع في اعتبارك أن الوصول إلى نظام الملفات إلى وحدة التخزين الخارجية من المقرر أن يتلاشى مع نظام Android Q.

إذا كنت تستخدم ACTION_GET_CONTENT ، وكان مخطط Uri الذي تحصل عليه هو file ، فسيكون getPath() مسارًا لنظام الملفات.

وإلا ، فأنت بحاجة إلى أن تفهم أنه ليس لديك فكرة عن مصدر المستند ، وأن تتوقف عن التفكير فيما يتعلق بـ "المسار الحقيقي للملف". استخدم ContentResolver و openInputStream() لإنشاء نسخة من المحتوى إلى بعض الملفات التي تتحكم فيها ، ثم العمل مع هذا الملف.

أعمل على تطبيق حيث أريد أن أكون قادرًا على تصدير واستيراد بعض البيانات من التطبيق ، على ملف .txt. الحد الأدنى من API التطبيق هو 21.

يعمل جزء التصدير بشكل جيد ، لكنني أواجه مشكلة في جزء الاستيراد.

أفتح مستكشف الملفات:

butImportPatient.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
         Intent intent = new Intent();
         intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
         intent.setType("*/*");
         startActivityForResult(intent, IMPORTPATIENT_ACTIVITY_REQUEST_CODE);
    }
});

هذا يبدو أنه يعمل.

لكن onActivityResult لا يعمل ، لم أجد كيف يمكنني الحصول على الملف من Uri.

في الوقت الحالي ، إليك الرمز الخاص بي:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

      if (requestCode == IMPORTPATIENT_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
            File file = new File(data.getData().getPath()) ;
            String path = file.getAbsolutePath() ;
            StringBuilder text = new StringBuilder();

            try {
                BufferedReader br = new BufferedReader(new FileReader(path));
                String line;

                while ((line = br.readLine()) != null) {
                    text.append(line);
                    text.append("\n");

                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            AlertDialog.Builder builder = new AlertDialog.Builder(this) ;
            builder.setMessage(path)
                    .show() ;

        }
 }

إنه مزيج من المشاركات المتعددة التي رأيتها هنا ، ولكن لا يبدو أن أي منها يعمل.

أحصل على هذا المسار:

/document/home:List.txt

يقوم بإنشاء FileNotFoundException. كيف يمكنني الحصول على المسار الحقيقي للملف؟


لدى Android مشكلة في قراءة المسار الحقيقي للملف من جهاز أوصيت لك باستخدام هذه المكتبة لتحديد الملف

تنفيذ 'com.droidninja: filepicker: 2.2.1' FielPicker





path