2017-09-06 30 views
6

Używam Ionic v1 z $cordovaFile i cordova email plugin, aby utworzyć plik, a następnie dołączyć go do nowej wiadomości e-mail. Mam działające rozwiązanie dla iOS na każdym urządzeniu, ale natknąłem się na dziwny problem z Androidem.Wewnętrzna pamięć wewnętrzna Ionic Android

Android File System Layout

Kiedy próbuje dołączyć plik utworzony w dowolnym miejscu pamięci wewnętrznej na Androida (DataDirectory itp), otrzymuję „Odmowa zgody na zajęcia”. Jednak po zapisaniu pliku w pamięci zewnętrznej załącznik zostanie pomyślnie dodany.

publikuję moją aplikację za pomocą zewnętrznej pamięci masowej dla Androida, ale niestety niektóre z dzisiejszych najbardziej popularnych urządzeń nie mają pamięci zewnętrznej.

Czy ktoś zna rozwiązanie? Zastanowiłem się nad obejściami, takimi jak przesłanie pliku do usługi hostingu plików, a także link do pobrania w e-mailu. Chciałbym użyć $cordovaFileTransfer, ale nie wiem, czy byłyby błędy uprawnień w pamięci wewnętrznej. Jeśli to możliwe, chciałbym użyć prawdziwego załącznika do wiadomości e-mail. Dzięki!

+0

Spróbuj dodać opcję 'Cordova wtyczki file' wtyczek, co robi to tworzy katalog i stanie odebrać plik, więc starają się oszczędzać swój email' txt 'plik używający tego. i proszę podziel się swoim kodem, w jaki sposób generujesz i wysyłaj wiadomość e-mail. – Webruster

+0

Sprawdź to pytanie, [tutaj] (https://stackoverflow.com/questions/46153968/how-to-access-sdcard-files-in-ionic-3) Dostęp do pamięci wewnętrznej jest możliwy. –

+0

Sprawdź to pytanie. [Tutaj] (https://stackoverflow.com/questions/46153968/how-to-access-sdcard-files-in-ionic-3) Dostęp do tylko pamięci wewnętrznej. –

Odpowiedz

3

Myślę, że Twój problem jest związany z pozwoleniem. Zaimplementowałem to dla załącznika pliku, aby dać uprawnienia do załączania plików, spróbuj mieć nadzieję, że ci to pomoże. Spróbuj tej wtyczki cordova.plugins.permissions

function checkPermission() { 
      var permissions = cordova.plugins.permissions; 
      permissions.hasPermission(permissions.READ_EXTERNAL_STORAGE, checkPermissionCallback, null); 
     } 

function checkPermissionCallback(status) { 
      $localStorage.StoragePermission = status.hasPermission; 
      if (!status.hasPermission) { 
       var permissions = cordova.plugins.permissions; 
       permissions.requestPermission(permissions.READ_EXTERNAL_STORAGE, null, null);     
      } 
     } 
3

Ponieważ problem jest głównie związane z Permission Issue, przed próbą moje drugie rozwiązanie spróbuj podać ten klucz w swojej config.xml

<preference name="AndroidPersistentFileLocation" value="Compatibility" /> 

Z Source Stwierdza, że:

Poprzednie wersje wtyczki wybierze lokalizację tymczasowych i trwałych plików przy uruchomieniu, na podstawie tego, czy urządzenie twierdziło, że karta SD (lub odpowiednia partycja pamięci) została zamontowana na . Jeżeli karta SD została zamontowana, lub w przypadku dużej pamięci wewnętrznej partycja była dostępna (jak na urządzeniach Nexus) wtedy trwałe pliki będą przechowywane w katalogu głównym tej przestrzeni. Oznaczało to , że wszystkie aplikacje Cordova mogły zobaczyć wszystkie pliki dostępne na karcie .

Jeżeli karta SD nie był dostępny, to poprzednie wersje będą przechowywać dane wynikające /data/data /, która izoluje aplikacje z każdej inny, ale nadal może spowodować dane mają być dzielone pomiędzy użytkowników.

Jest teraz możliwość wyboru, czy do przechowywania plików w wewnętrznym miejscu przechowywania plików lub przy użyciu poprzedniej logiki, z preferencją w pliku config.xml danej aplikacji. Aby to zrobić, dodaj jedną z tych dwóch linii do konfiguracji.xml:

<preference name="AndroidPersistentFileLocation" value="Internal" />

<preference name="AndroidPersistentFileLocation" value="Compatibility" />

Rozwiązanie 2:

można wysłać zawartość pliku w base64, starają się integrować angular-base64 w jonowej-app i spróbuj wysłać E-mail w formacie base64, tutaj jest przykładowy kod:

$scope.tosendEmail= function(subject, message, file_content){ 
    var file = null; 
    if(file_content != undefined){ 
     file = "base64:contact.vcf//"+$base64.encode(file_content); 
    } 

    var email_obj = { 
     subject: subject, 
     body: message, 
     isHtml:false, 
     attachments:file 
    }; 

    cordova.plugins.email.open(email_obj); 
} 

więc w ten sposób można wysłać załączniki

+0

Nie mogę przetestować żadnego z rozwiązań otrzymanych przez to pytanie, ponieważ nie jestem na moim komputerze programisty, ale zamierzam nagrodzić to rozwiązanie za pomocą nagrody. Zapewnia dodatkowe rozwiązanie w przypadku, gdy aktualizacja uprawnień nie działa. Używam obu rozwiązań (w tym Pritish) i zaznaczam poprawną odpowiedź, gdy tylko mogę przetestować. –