मैं एक ऐप बना रहा हूं और मुझे डिवाइस पर स्थानीय कक्ष डेटाबेस में डेटा आयात करने में सक्षम होने के लिए उपयोगकर्ता की आवश्यकता है। मैं यहां दिखाए गए Intent.ACTION_GET_CONTENT से प्रतिक्रिया प्राप्त करने के लिए startActivityForResult(...) विधि का उपयोग कर रहा हूं:

Intent intent = new Intent().setType("*/*").setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select File"), GET_FILE_INTENT_CODE);

उपयोगकर्ता से उस फ़ाइल का लेआउट निर्दिष्ट करने के लिए कहने के बाद जिसे आयात किया जाना है और इसे ImportStrategy में परिवर्तित करना है, मैं strategy और Uri दोनों को onActivityResult(...) में प्राप्त करता हूं। मेरी importData विधि के लिए

    void importData(Uri data, ImportStrategy strategy) {
        try {
            File csvFile = new File(Environment.getExternalStorageDirectory() + data.getPath());
            CSVReader reader = new CSVReader(new FileReader(csvFile.getAbsolutePath()));

            String[] nextLine;
            List<RainfallRecord> records = new ArrayList<>();

            while ((nextLine = reader.readNext()) != null) {
                records.add(getRecord(nextLine, strategy));
            }

            db.recordDao().insertAll(records);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Toast.makeText(this.getApplicationContext(), "Error loading file", Toast.LENGTH_LONG).show();
        } catch (IOException ex) {
            ex.printStackTrace();
            Toast.makeText(this.getApplicationContext(), "Error processing file", Toast.LENGTH_LONG).show();
        }
    }

जिस मुद्दे पर मैं चल रहा हूं वह यह है कि जब यह उस रेखा पर पहुंच जाता है जहां यह CSVReader बनाता है तो मुझे एक FileNotFoundException मिलता है स्टैक ट्रेस:

W/System.err: java.io.FileNotFoundException: /storage/emulated/0/document/1945 (No such file or directory)
W/System.err:     at java.io.FileInputStream.open0(Native Method)
W/System.err:     at java.io.FileInputStream.open(FileInputStream.java:231)
W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:165)
W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:112)
W/System.err:     at java.io.FileReader.<init>(FileReader.java:58)
W/System.err:     at ekshore.net.raintracker.MainActivity.importData(MainActivity.java:351)
W/System.err:     at ekshore.net.raintracker.MainActivity.lambda$customStrategy$11(MainActivity.java:406)
W/System.err:     at ekshore.net.raintracker.-$$Lambda$MainActivity$A7AYI1UOo4MNVQeFvopgj2wHPMM.onClick(Unknown Source:11)
W/System.err:     at android.view.View.performClick(View.java:6597)
W/System.err:     at android.view.View.performClickInternal(View.java:6574)
W/System.err:     at android.view.View.access$3100(View.java:778)
W/System.err:     at android.view.View$PerformClick.run(View.java:25885)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:873)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loop(Looper.java:193)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6669)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

जो यूआरआई वापस आ रहा है वह है content://com.android.providers.downloads.documents/document/1945 1945 अंत में Rain(2018).xlsx होना चाहिए

इस मुद्दे पर मैंने जितने भी शोध किए हैं, मैंने देखा है कि content के यूआरआई प्रकारों से फ़ाइलें लोड करने में समस्याएं हैं। लेकिन सभी सुधार जो मैंने देखे हैं वे मीडिया फ़ाइलों (या तो छवियों या ऑडियो) के लिए विशिष्ट हैं, इस तरह की अधिक डेटा उन्मुख फ़ाइलें नहीं। और जब मैंने ContentResolver का उपयोग करने वाले अन्य समाधानों की नकल करने की कोशिश की है तो मैं इसका पता नहीं लगा पाया हूं।

अगर कोई मुझे हाथ दे सकता है और मुझे यह पता लगाने में मदद कर सकता है तो मैं इसकी बहुत सराहना करूंगा।

0
Caleb Ekstrand 5 सितंबर 2018, 03:46

1 उत्तर

सबसे बढ़िया उत्तर

थोड़ा और शोध करने के बाद मैं इस ब्लॉग और पता चला कि मैं इसके बारे में गलत तरीके से जाने की कोशिश कर रहा था। जिस तरह से मुझे फ़ाइल खोलने की आवश्यकता है वह File ऑब्जेक्ट के माध्यम से नहीं है, जिसके लिए फ़ाइल पथ की आवश्यकता है। इसके बजाय मुझे ContentResolver बनाने और InputStream का उपयोग करने और इस तरह से डेटा प्राप्त करने की आवश्यकता थी, कोड इस तरह दिख रहा था:

try {
        ContentResolver contentResolver = this.getContentResolver();

        InputStream inputStream = contentResolver.openInputStream(data);
        Scanner scanner = new Scanner(inputStream).useDelimiter("\n");

        String nextLine = scanner.nextLine();
        List<RainfallRecord> records = new ArrayList<>();

        if (nextLine.matches("^[A-Za-z]"));
            nextLine = scanner.nextLine();

        while (scanner.hasNext()) {
            String[] rainData = nextLine.split(",");
            nextLine = scanner.nextLine();
            records.add(getRecord(rainData, strategy));
        }

        db.recordDao().insertAll(records);
    } catch (IOException ex) {
        ex.printStackTrace();
        Toast.makeText(this.getApplicationContext(), "Error processing file", Toast.LENGTH_LONG).show();
    }

if (nextLine.matches("^[A-Za-z]")); यह देखने के लिए जाँच कर रहा है कि क्या हेडर की जानकारी है और अगर है तो उसे छोड़ दें।

0
Caleb Ekstrand 15 सितंबर 2018, 09:51