Cześć,
tak jak w temacie.Tworzę aplikację która tworzy faktury i zapisuje je na dysku sd w formacie pdf.
Podczas zapisu pokazuje mi się błąd "sdcard/Invoice/invoice.pdf (Permision danied)".Sprawdzałem jakie mam uprawnienia to wygląda na to ,że mam wszystko ok (drwxrwxrwx).
Testowałem aplikację na androida 5.1 oraz 7.0.
Co może być przyczyną tego błędu i jak można to naprawić?
- Rejestracja:ponad 9 lat
- Ostatnio:4 miesiące
- Postów:98
- Rejestracja:około 7 lat
- Ostatnio:około 2 miesiące
- Postów:365
Tak jak wspomniał przedmówca: na tej stronie masz niemal wszystko opisane: https://developer.android.com/training/data-storage/files Warto zapoznać się z całością, Ciebie interesuje szczególnie część "Save a file on external storage".
- Rejestracja:ponad 9 lat
- Ostatnio:4 miesiące
- Postów:98
lubie_programowac napisał(a):
Tak jak wspomniał przedmówca: na tej stronie masz niemal wszystko opisane: https://developer.android.com/training/data-storage/files Warto zapoznać się z całością, Ciebie interesuje szczególnie część "Save a file on external storage".
ok super zapoznałem się ze stroną i zrobiłem wszystko to co zostało tam opisane (dodałem <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> w manifest file)
, ale nadal mam błąd "Permission Danied" kod:
public void createInvoice(View view) {
// create a new document
PdfDocument document = new PdfDocument();
// crate a page description
PdfDocument.PageInfo pageInfo =
new PdfDocument.PageInfo.Builder(100, 100, 1).create();
// start a page
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(50, 50, 30, paint);
// finish the page
document.finishPage(page);
// Create Page 2
pageInfo = new PdfDocument.PageInfo.Builder(500, 500, 2).create();
page = document.startPage(pageInfo);
canvas = page.getCanvas();
paint = new Paint();
paint.setColor(Color.BLUE);
canvas.drawCircle(200, 200, 100, paint);
document.finishPage(page);
// write the document content
String targetPdf = "/sdcard/test.pdf";
File filePath = new File(targetPdf);
try {
document.writeTo(new FileOutputStream(filePath));
Toast.makeText(this, "Done", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Something wrong: " + e.toString(),
Toast.LENGTH_LONG).show();
}
// close the document
document.close();
}
- Rejestracja:około 7 lat
- Ostatnio:około 2 miesiące
- Postów:365
Plik który chcesz utworzyć to String targetPdf = "/sdcard/test.pdf"; Android nie pozwala na bezpośredni dostęp do plików (ze względów bezpieczeństwa - nie chciałbyś chyba żeby każda aplikacja mogła odczytać plik z Twoimi smsami prawda?). Każdy dostęp trzeba zrealizować poprzez np File file = new File(context.getFilesDir(), filename); albo https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String). Wszystkie informacje są podane w linku który dodałem.
- Rejestracja:ponad 9 lat
- Ostatnio:4 miesiące
- Postów:98
lubie_programowac napisał(a):
Plik który chcesz utworzyć to String targetPdf = "/sdcard/test.pdf"; Android nie pozwala na bezpośredni dostęp do plików (ze względów bezpieczeństwa - nie chciałbyś chyba żeby każda aplikacja mogła odczytać plik z Twoimi smsami prawda?). Każdy dostęp trzeba zrealizować poprzez np File file = new File(context.getFilesDir(), filename); albo https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String). Wszystkie informacje są podane w linku który dodałem.
super o to mi chodziło dziękuję za pomoc
- Rejestracja:około 7 lat
- Ostatnio:ponad 6 lat
- Postów:369
lubie_programowac napisał(a):
Plik który chcesz utworzyć to String targetPdf = "/sdcard/test.pdf"; Android nie pozwala na bezpośredni dostęp do plików (ze względów bezpieczeństwa - nie chciałbyś chyba żeby każda aplikacja mogła odczytać plik z Twoimi smsami prawda?). Każdy dostęp trzeba zrealizować poprzez np File file = new File(context.getFilesDir(), filename); albo https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String). Wszystkie informacje są podane w linku który dodałem.
Że co? Do /sdcard ma dostęp każda aplikacja, o ile prawidłowo poprosi o uprawnienia zapisu pamięci wewnętrznej. Ograniczenia są tylko w dostępie do zewnętrznych nośników, jak zewnętrzna karta sd albo pamięć usb. Baza danych smsów nie jest w ogóle dostępna jako plik bez roota i jest przechowywana zupełnie gdzie indziej.