Μια επισκόπηση του Android Storage

Η αποθήκευση είναι αυτό που όλοι γνωρίζουμε, αλλά πάντα θεωρούμε δεδομένο. Πριν από λίγο καιρό, κάθε άλμα στην χωρητικότητα αποθήκευσης ήταν σταδιακό και φαινόταν αδύνατο. Σήμερα, δεν δίνουμε μια δεύτερη σκέψη όταν εξετάζουμε πόσα από αυτά έχουν οι συσκευές μας (και δεν ενδιαφερόμαστε λιγότερο για τις διαφορές).

Ένα μεγαλύτερο σημείο θα ήταν να δούμε την εξέλιξη του τι είναι αποθηκευμένο στη μνήμη. Πριν από τα smartphone, αποθηκεύσαμε την περιστασιακή φωτογραφία ή δύο, μερικά παιχνίδια και έναν τόνο γραπτών μηνυμάτων. Αλλά τώρα, κάθε τυπικό τηλέφωνο θα έχει μια σύνθεση από εφαρμογές, έγγραφα, φωτογραφίες, βίντεο, αρχεία μουσικής και πολλά άλλα. Ας μάθουμε πώς μπορούμε να χρησιμοποιήσουμε τον αποθηκευτικό χώρο μιας συσκευής για τις εφαρμογές μας.

Αυτό που θα καλύψουμε σε αυτό το άρθρο είναι:

  1. Οι διαφορετικοί τύποι αποθήκευσης σε τηλέφωνα Android
  2. Διαφορές μεταξύ των τύπων αποθήκευσης
  3. Τρόπος χρήσης του χώρου αποθήκευσης στην εφαρμογή σας

Κάθε εφαρμογή έχει πρόσβαση σε δύο διαφορετικούς τύπους αποθήκευσης: εσωτερική και εξωτερική . Υπάρχουν σημαντικές διαφορές μεταξύ αυτών των δύο τύπων αποθήκευσης και η γνώση τους θα σας βοηθήσει κατά το σχεδιασμό της επόμενης εφαρμογής σας.

Πριν ξεκινήσουμε, ένα πράγμα πρέπει να ειπωθεί για την αποθήκευση και την προσωρινή μνήμη. Ο χώρος αποθήκευσης προορίζεται για πράγματα που θέλετε να αποθηκεύσετε μόνιμα, ενώ υπάρχει προσωρινή μνήμη για να αποθηκεύετε τα πράγματα προσωρινά.

Κινούμενη μέρα

Εσωτερική αποθήκευση

Όταν κάθε εφαρμογή εκτελείται στο λειτουργικό σύστημα, έχει τον δικό του εσωτερικό χώρο αποθήκευσης. Αυτός ο χώρος αποθήκευσης είναι ιδιωτικός και μόνο για τη χρήση της εφαρμογής. Δηλαδή, άλλες εφαρμογές δεν μπορούν να έχουν πρόσβαση σε αυτόν, ούτε ο χρήστης. Ένα άλλο πράγμα που πρέπει να θυμάστε όταν χρησιμοποιείτε εσωτερικό χώρο αποθήκευσης είναι η διαθεσιμότητα αυτού. Σε αντίθεση με τον εξωτερικό χώρο αποθήκευσης, ο εσωτερικός χώρος αποθήκευσης είναι πάντα διαθέσιμος για την εφαρμογή σας.

Ωστόσο, η χρήση αυτού του χώρου αποθήκευσης έχει τα μειονεκτήματά της. Εάν ο χρήστης καταργήσει την εφαρμογή, καταργούνται επίσης όλα τα δεδομένα που είναι αποθηκευμένα στον εσωτερικό χώρο αποθήκευσης της εφαρμογής σας. Φανταστείτε τι θα συνέβαινε εάν εγκαταστήσατε ένα παιχνίδι στο τηλέφωνό σας και κάπου στο δρόμο αποφάσισε να το καταργήσει. Θα θέλατε να αποθηκεύσετε την πρόοδο του παιχνιδιού σας, εάν κατά τύχη θα εγκαταστήσατε ξανά το παιχνίδι.

Λοιπόν, πώς αποθηκεύουμε ένα αρχείο στον εσωτερικό χώρο αποθήκευσης;

public void saveFileInternalStorage() { String FILENAME = "hello_world_file"; String inputToFile = "Hello From Internal Storage!"; try { FileOutputStream fileOutputStream = openFileOutput(FILENAME, Context.MODE_PRIVATE); fileOutputStream.write(inputToFile.getBytes()); fileOutputStream.close(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has been saved successfully", Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } }

Όπως μπορείτε να δείτε στο παράδειγμα κώδικα, αποθηκεύουμε ένα αρχείο που ονομάζεται hello_world_file και περιέχει το κείμενο, "Γεια σας από τον εσωτερικό χώρο αποθήκευσης!" . Έχω δημιουργήσει δύο ρήτρες σύλληψης μόνο για να δείξω τις εξαιρέσεις που μπορεί να προκύψουν όταν προσπαθώ να το κάνω αυτό, αλλά μπορείτε να τις ελαχιστοποιήσετε σε μία ρήτρα αλίευσης με το γενικό αντικείμενο Εξαίρεσης.

Προσέξτε ότι η μέθοδος openFileOutput θα ανοίξει το αρχείο εάν υπάρχει ήδη, αλλά αν όχι, θα το δημιουργήσει. Η δεύτερη παράμετρος αυτής της μεθόδου είναι η λειτουργία αρχείου. Αυτή η παράμετρος καθορίζει το εύρος του αρχείου και την πρόσβαση σε αυτό. Η προεπιλεγμένη τιμή είναι MODE_PRIVATE, γεγονός που καθιστά το αρχείο προσβάσιμο μόνο στην εφαρμογή σας.

Οι άλλες δύο τιμές για αυτήν την παράμετρο είναι MODE_WORLD_READABLE και MODE_WORLD_WRITEABLE, αλλά έχουν καταργηθεί από το API 17. Η κοινή χρήση ιδιωτικών αρχείων με άλλες εφαρμογές χρησιμοποιεί ένα διαφορετικό σύνολο λογικής για το οποίο μπορείτε να διαβάσετε περισσότερα εδώ. Τέλος, κατά την εγγραφή στο αρχείο, μετατρέπουμε τη συμβολοσειρά μας σε byte και φροντίζουμε να κλείσουμε το αρχείο στο τέλος.

Broken HDD - Backup αποθήκευσης

Εξωτερική αποθήκευση

Σε αντίθεση με αυτό που υπονοεί το όνομα, πρόκειται για αποθήκευση που ορίζεται από το γεγονός ότι δεν είναι πάντα προσβάσιμη. Αυτό μπορεί να σημαίνει ότι μπορεί να είναι μια εξωτερική κάρτα SD (δευτερεύων εξωτερικός χώρος αποθήκευσης), αλλά μπορεί επίσης να είναι αποθηκευτικός χώρος που βρίσκεται στη συσκευή (κύριος εξωτερικός χώρος αποθήκευσης).

Για να φέρετε το σπίτι στο σπίτι, ο εξωτερικός χώρος αποθήκευσης είναι χώρος αποθήκευσης στον οποίο μπορείτε να έχετε πρόσβαση όταν συνδέετε τη συσκευή σας σε υπολογιστή μέσω καλωδίου USB. Όπως ίσως έχετε μαντέψει, οτιδήποτε αποθηκεύεται σε αυτόν τον τύπο χώρου αποθήκευσης είναι προσβάσιμο σε άλλες εφαρμογές στη συσκευή σας, αλλά θα διατηρηθεί εάν απεγκαταστήσετε την εφαρμογή.

Προτού μπορέσουμε να δείξουμε πώς να αποθηκεύουμε αρχεία στον εξωτερικό χώρο αποθήκευσης, πρέπει να κάνουμε δύο πράγματα:

  1. Βεβαιωθείτε ότι υπάρχει αρκετός χώρος για να αποθηκεύσετε το αρχείο
  2. Ζητήστε άδεια κατά τη διάρκεια του χρόνου εκτέλεσης

Για να βεβαιωθείτε ότι υπάρχει αρκετός αποθηκευτικός χώρος απαιτείται οι ακόλουθες γραμμές κώδικα:

//Check if you can read/write to external storage public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; }

Για να αποκτήσουμε πρόσβαση στον εξωτερικό χώρο αποθήκευσης, πρέπει να προσθέσουμε την ακόλουθη άδεια στο AndroidManifest.xml:

Επιπλέον, από το API 23, επικίνδυνα δικαιώματα δεν επιτρέπονται κατά τη διάρκεια της εγκατάστασης, αλλά κατά τη διάρκεια του χρόνου εκτέλεσης. Η εγγραφή σε εξωτερικό χώρο αποθήκευσης κατηγοριοποιείται ως μία, οπότε πρέπει να προσθέσουμε λογική για να επιτρέψουμε στον χρήστη να αποφασίσει εάν θα παραχωρήσει άδεια στην εφαρμογή ή όχι.

public void saveFileExternalStorage(View view) { if (isExternalStorageWritable()) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { writeFileToExternalStorage(); } else{ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 0: { writeFileToExternalStorage(); break; } } }

Το writeFileToExternalStorage μοιάζει με αυτό:

public void writeFileToExternalStorage() { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/saved_files"); if (!myDir.exists()) { myDir.mkdirs(); } try { File file = new File(myDir, "myfile.txt"); FileOutputStream out = new FileOutputStream(file); out.write(inputToFile.getBytes()); out.close(); Toast.makeText(getApplicationContext(), "File myfile.txt" + " has been saved successfully to external storage", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } }

Εάν θέλετε να δείτε ένα παράδειγμα όλου του κώδικα που παρουσιάζεται εδώ, μπορείτε να κατευθυνθείτε σε αυτό το αποθετήριο GitHub.

Εννέα Οκτώ Επτά

Καλό να ξέρω

Παρακάτω ήταν μόνο δύο απλά παραδείγματα για το πώς να εργαστείτε με τους διαφορετικούς τύπους αποθηκευτικού χώρου για την εφαρμογή σας. Δεδομένου ότι έχουμε να κάνουμε με έναν πόρο που διαχειρίζεται το σύστημα, πρέπει επίσης να γνωρίζουμε τις συμπεριφορές που σχετίζονται με αυτό.

Από προεπιλογή, η εφαρμογή σας θα εγκατασταθεί σε εσωτερικό χώρο αποθήκευσης ( βλέπε εσωτερική εξήγηση μόνο ), αλλά από το επίπεδο API 8, μπορείτε να προσθέσετε ένα χαρακτηριστικό, installLocation , στο μανιφέστο σας που επιτρέπει την εγκατάσταση της εφαρμογής σας σε εξωτερικό χώρο αποθήκευσης. Ένας λόγος για αυτό είναι εάν η εφαρμογή σας είναι πολύ μεγάλη και προτιμάτε ο χρήστης να την εγκαταστήσει στον εξωτερικό χώρο αποθήκευσης της συσκευής, καθώς υπάρχει περισσότερος χώρος εκεί.

Υπάρχουν τρεις τιμές για αυτό το χαρακτηριστικό:

  • Αυτόματο - σημαίνει ότι δεν έχετε συγκεκριμένη προτίμηση για την εγκατάσταση της εφαρμογής. Η εφαρμογή θα προσπαθήσει να εγκατασταθεί στον εσωτερικό χώρο αποθήκευσης, αλλά εάν είναι πλήρης, θα την εγκαταστήσει σε εξωτερικό χώρο αποθήκευσης
  • internalOnly - the application will only be installed to internal storage, and if there isn’t enough space there, it will not be installed
  • preferExternal - means that you want your application to be installed to external storage, but if there is not enough room there, it will be installed internally

For both the auto and the preferExternal options, the user has the option of moving the application from external storage to internal, and vice versa.

Keep in mind that once a user connects their device to a computer and enables it to share data or unmounts an SD card, all applications running from the external storage are destroyed. If your application uses one of the following features, you should not install it to external storage:

Διάφορες υπηρεσίες (υπηρεσία ειδοποίησης s κυρίως), Input Method μηχανές, Ζωντανές ταπετσαρίες, Widgets Εφαρμογή, Διευθυντές Λογαριασμό, Συγχρονισμός προσαρμογείς, διαχειριστές συσκευής και δέκτες Broadcast ακρόαση για την εκκίνηση ολοκληρωθεί.