Zanim skopiujesz / wkleisz jedno z poniższych (świetnych!) Rozwiązań, rozważ użycie tej biblioteki w jednym wierszu kodu: stackoverflow.com/a/41970539/9648
JohnnyLambada
Odpowiedzi:
346
Jeśli ktoś ma ten sam problem, właśnie tak to zrobiłem
aby zapisać pliki na karcie SD, musisz wyrazić zgodę na manifest, np. <uses-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
IronBlossom
22
Nie polegałbym również na tym, że sdcard znajduje się w / sdcard, ale pobierałem ścieżkę za pomocą Environment.getExternalStorageDirectory ()
Axarydax
2
Czy powinienem użyć: 16 * 1024 (16 kb) Zwykle wybieram 16 K lub 32 K jako dobrą równowagę między zużyciem pamięci a wydajnością.
Nam Vu,
3
@ rciovati dostał ten błąd czasu wykonaniaFailed to copy asset file: myfile.txt java.io.FileNotFoundException: myfile.txt at android.content.res.AssetManager.openAsset(Native Method)
likejudo
7
Dla mnie ten kod działa tylko wtedy, gdy dodam: in = assetManager.open("images-wall/"+filename);gdzie „obrazy-ściana” to mój folder w zasobach
Ultimo_m
62
W oparciu o twoje rozwiązanie zrobiłem coś własnego, aby umożliwić podfoldery. Ktoś może uznać to za pomocne:
assetManager.list(path)może być powolny na urządzeniu, aby wcześniej utworzyć listę ścieżek zasobów, tego fragmentu można użyć z assetsfind . -name "*" -type f -exec ls -l {} \; | awk '{print substr($9,3)}' >> assets.list
katalogu
3
Fajne rozwiązanie! Jedyną wymaganą poprawką jest przycięcie wiodących separatorów na początku copyFileOrDir (): path = path.startsWith ("/")? path.substring (1): ścieżka;
Cross_
Ten
przepełnienie stosu występuje
2
zamień „/ data / data /” + this.getPackageName () na
this.getFilesDir
1
... i zamykaj strumienie w finallybloku))
Mixaz
48
Powyższe rozwiązanie nie działało z powodu niektórych błędów:
tworzenie katalogu nie działało
zasoby zwrócone przez system Android zawierają również trzy foldery: obrazy, dźwięki i zestaw webowy
Dodano sposób postępowania z dużymi plikami: dodaj rozszerzenie .mp3 do pliku w folderze zasobów w projekcie, a podczas kopiowania plik docelowy będzie bez rozszerzenia .mp3
Oto kod (zostawiłem instrukcje Log, ale możesz je teraz upuścić):
finalstaticString TARGET_BASE_PATH ="/sdcard/appname/voices/";privatevoid copyFilesToSdCard(){
copyFileOrDir("");// copy all files in assets folder in my project}privatevoid copyFileOrDir(String path){AssetManager assetManager =this.getAssets();String assets[]=null;try{Log.i("tag","copyFileOrDir() "+path);
assets = assetManager.list(path);if(assets.length ==0){
copyFile(path);}else{String fullPath = TARGET_BASE_PATH + path;Log.i("tag","path="+fullPath);File dir =newFile(fullPath);if(!dir.exists()&&!path.startsWith("images")&&!path.startsWith("sounds")&&!path.startsWith("webkit"))if(!dir.mkdirs())Log.i("tag","could not create dir "+fullPath);for(int i =0; i < assets.length;++i){String p;if(path.equals(""))
p ="";else
p = path +"/";if(!path.startsWith("images")&&!path.startsWith("sounds")&&!path.startsWith("webkit"))
copyFileOrDir( p + assets[i]);}}}catch(IOException ex){Log.e("tag","I/O Exception", ex);}}privatevoid copyFile(String filename){AssetManager assetManager =this.getAssets();InputStreamin=null;OutputStreamout=null;String newFileName =null;try{Log.i("tag","copyFile() "+filename);in= assetManager.open(filename);if(filename.endsWith(".jpg"))// extension was added to avoid compression on APK file
newFileName = TARGET_BASE_PATH + filename.substring(0, filename.length()-4);else
newFileName = TARGET_BASE_PATH + filename;out=newFileOutputStream(newFileName);byte[] buffer =newbyte[1024];int read;while((read =in.read(buffer))!=-1){out.write(buffer,0, read);}in.close();in=null;out.flush();out.close();out=null;}catch(Exception e){Log.e("tag","Exception in copyFile() of "+newFileName);Log.e("tag","Exception in copyFile() "+e.toString());}}
EDYCJA: Poprawiono źle umieszczony „;” powodowało to systematyczny błąd „nie można utworzyć katalogu”.
UWAGA: Log.i („tag”, „nie można utworzyć katalogu” + fullPath); zawsze dzieje się jako; jest źle umieszczone w if.
RoundSparrow hilltx
świetny sposób! Wielkie dzięki! Ale dlaczego sprawdzasz plik jpg?
Phuong,
32
Wiem, że udzielono odpowiedzi, ale mam nieco bardziej elegancki sposób kopiowania z katalogu zasobów do pliku na karcie SD. Nie wymaga pętli „for”, ale zamiast tego używa strumieni plików i kanałów do wykonania pracy.
(Uwaga) Jeśli używasz dowolnego typu skompresowanego pliku, APK, PDF, ... możesz zmienić nazwę rozszerzenia pliku przed wstawieniem do zasobu, a następnie zmienić nazwę po skopiowaniu go na kartę SD)
AssetManager am = context.getAssets();AssetFileDescriptor afd =null;try{
afd = am.openFd("MyFile.dat");// Create new file to copy into.File file =newFile(Environment.getExternalStorageDirectory()+ java.io.File.separator +"NewFile.dat");
file.createNewFile();
copyFdToFile(afd.getFileDescriptor(), file);}catch(IOException e){
e.printStackTrace();}
Sposób na skopiowanie pliku bez konieczności jego zapętlania.
Podobało mi się to w porównaniu z innymi rozwiązaniami, nieco starszymi. Nieznaczna modyfikacja mojego, która obejmuje tworzenie brakujących folderów plików. Twoje zdrowie!
Chris.Jenkins
3
Nie działałoby to dla mnie poza deskryptorem pliku This file can not be opened as a file descriptor; it is probably compressed- jest to plik pdf. Wiesz jak to naprawić?
Gaʀʀʏ
1
Zakłada się, że inChannel.size () zwraca rozmiar pliku. Nie daje takiej gwarancji . Dostaję 2,5 MiB za 2 pliki o wielkości 450 KiB każdy.
AI0867
1
Właśnie odkryłem, że AssetFileDescriptor.getLength () zwróci prawidłowy rozmiar pliku.
AI0867
1
Oprócz powyższego zasób nie może zaczynać się w lokalizacji 0 w deskryptorze pliku. AssetFileDescriptor.getStartOffset () zwróci początkowe przesunięcie.
AI0867
5
wypróbuj to jest o wiele prostsze, to pomoże ci:
// Open your local db as the input streamInputStream myInput = _context.getAssets().open(YOUR FILE NAME);// Path to the just created empty dbString outFileName =SDCARD PATH + YOUR FILE NAME;// Open the empty db as the output streamOutputStream myOutput =newFileOutputStream(outFileName);// transfer bytes from the inputfile to the outputfilebyte[] buffer =newbyte[1024];int length;while((length = myInput.read(buffer))>0){
myOutput.write(buffer,0, length);}// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
list (assetPath) ?. Niech {...} w rzeczywistości. Nullable.
Gábor
4
Oto oczyszczona wersja dla obecnych urządzeń z Androidem, funkcjonalny projekt metody, dzięki czemu można skopiować ją do klasy AssetsHelper np;)
/**
*
* Info: prior to Android 2.3, any compressed asset file with an
* uncompressed size of over 1 MB cannot be read from the APK. So this
* should only be used if the device has android 2.3 or later running!
*
* @param c
* @param targetFolder
* e.g. {@link Environment#getExternalStorageDirectory()}
* @throws Exception
*/@TargetApi(Build.VERSION_CODES.GINGERBREAD)publicstaticboolean copyAssets(AssetManager assetManager,File targetFolder)throwsException{Log.i(LOG_TAG,"Copying files from assets to folder "+ targetFolder);return copyAssets(assetManager,"", targetFolder);}/**
* The files will be copied at the location targetFolder+path so if you
* enter path="abc" and targetfolder="sdcard" the files will be located in
* "sdcard/abc"
*
* @param assetManager
* @param path
* @param targetFolder
* @return
* @throws Exception
*/publicstaticboolean copyAssets(AssetManager assetManager,String path,File targetFolder)throwsException{Log.i(LOG_TAG,"Copying "+ path +" to "+ targetFolder);String sources[]= assetManager.list(path);if(sources.length ==0){// its not a folder, so its a file:
copyAssetFileToFolder(assetManager, path, targetFolder);}else{// its a folder:if(path.startsWith("images")|| path.startsWith("sounds")|| path.startsWith("webkit")){Log.i(LOG_TAG," > Skipping "+ path);returnfalse;}File targetDir =newFile(targetFolder, path);
targetDir.mkdirs();for(String source : sources){String fullSourcePath = path.equals("")? source :(path
+File.separator + source);
copyAssets(assetManager, fullSourcePath, targetFolder);}}returntrue;}privatestaticvoid copyAssetFileToFolder(AssetManager assetManager,String fullAssetPath,File targetBasePath)throwsIOException{InputStreamin= assetManager.open(fullAssetPath);OutputStreamout=newFileOutputStream(newFile(targetBasePath,
fullAssetPath));byte[] buffer =newbyte[16*1024];int read;while((read =in.read(buffer))!=-1){out.write(buffer,0, read);}in.close();out.flush();out.close();}
Korzystając z niektórych pojęć w odpowiedziach na to pytanie, napisałem klasę powołaną, AssetCopieraby uprościć kopiowanie /assets/. Jest dostępny na github i można uzyskać do niego dostęp za pomocą jitpack.io :
Najpierw musisz upewnić się, że plik jest przechowywany bez kompresji. System pakowania może wybrać kompresję dowolnego pliku z rozszerzeniem, które nie jest oznaczone jako noCompress , a skompresowanych plików nie można zmapować w pamięci, więc będziesz musiał polegać na AssetManager.open w takim przypadku .
Możesz dodać rozszerzenie „.mp3” do swojego pliku, aby zatrzymać kompresję, ale właściwym rozwiązaniem jest zmodyfikowanie pliku app / build.gradle i dodanie następujących wierszy (aby wyłączyć kompresję plików PDF)
aaptOptions {
noCompress 'pdf'}
Pakowanie plików
Zauważ, że program pakujący wciąż może spakować wiele plików w jeden, więc nie możesz po prostu odczytać całego pliku, który daje Ci AssetManager . Musisz zapytać AssetFileDescriptor które części potrzebujesz.
Znalezienie właściwej części spakowanego pliku
Po upewnieniu się, że plik jest przechowywany nieskompresowany, możesz użyć metody AssetManager.openFd , aby uzyskać AssetFileDescriptor , którego można użyć do uzyskania FileInputStream (w przeciwieństwie do AssetManager.open , który zwraca InputStream ), który zawiera FileChannel . Zawiera także początkowe przesunięcie (getStartOffset) i rozmiar (getLength) , których potrzebujesz, aby uzyskać poprawną część pliku.
Cześć chłopaki, zrobiłem coś takiego. Dla N-tej głębokości skopiuj folder i pliki do skopiowania. Który pozwala skopiować całą strukturę katalogów do skopiowania z Android AssetManager :)
privatevoid manageAssetFolderToSDcard(){try{String arg_assetDir = getApplicationContext().getPackageName();String arg_destinationDir =FRConstants.ANDROID_DATA + arg_assetDir;FileFolderInCache=newFile(arg_destinationDir);if(!FolderInCache.exists()){
copyDirorfileFromAssetManager(arg_assetDir, arg_destinationDir);}}catch(IOException e1){
e1.printStackTrace();}}publicString copyDirorfileFromAssetManager(String arg_assetDir,String arg_destinationDir)throwsIOException{File sd_path =Environment.getExternalStorageDirectory();String dest_dir_path = sd_path + addLeadingSlash(arg_destinationDir);File dest_dir =newFile(dest_dir_path);
createDir(dest_dir);AssetManager asset_manager = getApplicationContext().getAssets();String[] files = asset_manager.list(arg_assetDir);for(int i =0; i < files.length; i++){String abs_asset_file_path = addTrailingSlash(arg_assetDir)+ files[i];String sub_files[]= asset_manager.list(abs_asset_file_path);if(sub_files.length ==0){// It is a fileString dest_file_path = addTrailingSlash(dest_dir_path)+ files[i];
copyAssetFile(abs_asset_file_path, dest_file_path);}else{// It is a sub directory
copyDirorfileFromAssetManager(abs_asset_file_path, addTrailingSlash(arg_destinationDir)+ files[i]);}}return dest_dir_path;}publicvoid copyAssetFile(String assetFilePath,String destinationFilePath)throwsIOException{InputStreamin= getApplicationContext().getAssets().open(assetFilePath);OutputStreamout=newFileOutputStream(destinationFilePath);byte[] buf =newbyte[1024];int len;while((len =in.read(buf))>0)out.write(buf,0, len);in.close();out.close();}publicString addTrailingSlash(String path){if(path.charAt(path.length()-1)!='/'){
path +="/";}return path;}publicString addLeadingSlash(String path){if(path.charAt(0)!='/'){
path ="/"+ path;}return path;}publicvoid createDir(File dir)throwsIOException{if(dir.exists()){if(!dir.isDirectory()){thrownewIOException("Can't create directory, a file is in the way");}}else{
dir.mkdirs();if(!dir.isDirectory()){thrownewIOException("Unable to create directory");}}}
W oparciu o rozwiązanie Rohitha Nandakumara zrobiłem coś własnego, aby skopiować pliki z podfolderu zasobów (tj. „ Asset / MyFolder ”). Sprawdzam też, czy plik już istnieje w sdcard, zanim spróbuję ponownie skopiować.
privatevoid copyAssets(){AssetManager assetManager = getAssets();String[] files =null;try{
files = assetManager.list("MyFolder");}catch(IOException e){Log.e("tag","Failed to get asset file list.", e);}if(files !=null)for(String filename : files){InputStreamin=null;OutputStreamout=null;try{in= assetManager.open("MyFolder/"+filename);File outFile =newFile(getExternalFilesDir(null), filename);if(!(outFile.exists())){// File does not exist...out=newFileOutputStream(outFile);
copyFile(in,out);}}catch(IOException e){Log.e("tag","Failed to copy asset file: "+ filename, e);}finally{if(in!=null){try{in.close();}catch(IOException e){// NOOP}}if(out!=null){try{out.close();}catch(IOException e){// NOOP}}}}}privatevoid copyFile(InputStreamin,OutputStreamout)throwsIOException{byte[] buffer =newbyte[1024];int read;while((read =in.read(buffer))!=-1){out.write(buffer,0, read);}}
To zdecydowanie najlepsze rozwiązanie, jakie udało mi się znaleźć w Internecie. Użyłem następującego linku https://gist.github.com/mhasby/026f02b33fcc4207b302a60645f6e217 , ale miał jeden błąd, który naprawiłem, a potem działa jak urok. Oto mój kod. Możesz go łatwo używać, ponieważ jest to niezależna klasa Java.
Jak widać, po prostu stwórz instancję CopyAssetsw swojej klasie Java, która ma aktywność. Teraz ta część jest ważna, jeśli chodzi o moje badania i poszukiwania w internecie You cannot use AssetManager if the class has no activity. Ma to coś wspólnego z kontekstem klasy java.
Teraz c.copyAssets(getApplicationContext())jest to łatwy sposób na dostęp do metody, gdzie cjest i instancja CopyAssetsklasy. Zgodnie z moimi wymaganiami zezwoliłem programowi na skopiowanie wszystkich plików zasobów z assetfolderu do /www/resources/mojego katalogu wewnętrznego.
Możesz łatwo znaleźć część, w której musisz dokonać zmian w katalogu zgodnie z przeznaczeniem. Jeśli potrzebujesz pomocy, wyślij mi ping.
Postępując zgodnie z tymi krokami, aby uniknąć FileUriExposedExceptions, załóżmy, że użytkownik udzielił WRITE_EXTERNAL_STORAGEuprawnienia, a plik jest w assets/pdfs/mypdf.pdf.
private fun openFile(){var inputStream:InputStream?=nullvar outputStream:OutputStream?=nulltry{
val file =File("${activity.getExternalFilesDir(null)}/$PDF_FILE_NAME")if(!file.exists()){
inputStream = activity.assets.open("$PDF_ASSETS_PATH/$PDF_FILE_NAME")
outputStream =FileOutputStream(file)
copyFile(inputStream, outputStream)}
val uri =FileProvider.getUriForFile(
activity,"${BuildConfig.APPLICATION_ID}.provider.GenericFileProvider",
file
)
val intent =Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri,"application/pdf")
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)}
activity.startActivity(intent)}catch(ex:IOException){
ex.printStackTrace()}catch(ex:ActivityNotFoundException){
ex.printStackTrace()}finally{
inputStream?.close()
outputStream?.flush()
outputStream?.close()}}@Throws(IOException::class)private fun copyFile(input:InputStream, output:OutputStream){
val buffer =ByteArray(1024)var read:Int= input.read(buffer)while(read !=-1){
output.write(buffer,0, read)
read = input.read(buffer)}}
companion object{privateconst val PDF_ASSETS_PATH ="pdfs"privateconst val PDF_FILE_NAME ="mypdf.pdf"}
Odpowiedzi:
Jeśli ktoś ma ten sam problem, właśnie tak to zrobiłem
Odwołanie: przenieś plik przy użyciu Java
źródło
Failed to copy asset file: myfile.txt java.io.FileNotFoundException: myfile.txt at android.content.res.AssetManager.openAsset(Native Method)
in = assetManager.open("images-wall/"+filename);
gdzie „obrazy-ściana” to mój folder w zasobachW oparciu o twoje rozwiązanie zrobiłem coś własnego, aby umożliwić podfoldery. Ktoś może uznać to za pomocne:
...
...
źródło
assetManager.list(path)
może być powolny na urządzeniu, aby wcześniej utworzyć listę ścieżek zasobów, tego fragmentu można użyć zassets
find . -name "*" -type f -exec ls -l {} \; | awk '{print substr($9,3)}' >> assets.list
finally
bloku))Powyższe rozwiązanie nie działało z powodu niektórych błędów:
Oto kod (zostawiłem instrukcje Log, ale możesz je teraz upuścić):
EDYCJA: Poprawiono źle umieszczony „;” powodowało to systematyczny błąd „nie można utworzyć katalogu”.
źródło
Wiem, że udzielono odpowiedzi, ale mam nieco bardziej elegancki sposób kopiowania z katalogu zasobów do pliku na karcie SD. Nie wymaga pętli „for”, ale zamiast tego używa strumieni plików i kanałów do wykonania pracy.
(Uwaga) Jeśli używasz dowolnego typu skompresowanego pliku, APK, PDF, ... możesz zmienić nazwę rozszerzenia pliku przed wstawieniem do zasobu, a następnie zmienić nazwę po skopiowaniu go na kartę SD)
Sposób na skopiowanie pliku bez konieczności jego zapętlania.
źródło
This file can not be opened as a file descriptor; it is probably compressed
- jest to plik pdf. Wiesz jak to naprawić?wypróbuj to jest o wiele prostsze, to pomoże ci:
źródło
W Kotlinie byłoby to zwięzłe.
źródło
Oto oczyszczona wersja dla obecnych urządzeń z Androidem, funkcjonalny projekt metody, dzięki czemu można skopiować ją do klasy AssetsHelper np;)
źródło
Zmodyfikowano tę odpowiedź SO przez @DannyA
Przygotowania
w
src/main/assets
dodaj folder z nazwąfold
Stosowanie
W katalogu zewnętrznym znajdź wszystkie pliki i katalogi znajdujące się w zasobach fold
źródło
Skopiuj wszystkie pliki i katalogi z zasobów do swojego folderu!
do kopiowania lepiej użyj apache commons io
// TO JEST GŁÓWNA METODA KOPIOWANIA
źródło
W oparciu o odpowiedź Yorama Cohena, oto wersja, która obsługuje niestatyczny katalog docelowy.
Invoque with,
copyFileOrDir(getDataDir(), "")
aby zapisać do wewnętrznego folderu przechowywania aplikacji / danych / danych / pkg_name /Unika kopiowania „obrazów” itp. Fałszywych folderów zasobów, takich jak
źródło
Korzystając z niektórych pojęć w odpowiedziach na to pytanie, napisałem klasę powołaną,
AssetCopier
aby uprościć kopiowanie/assets/
. Jest dostępny na github i można uzyskać do niego dostęp za pomocą jitpack.io :Więcej informacji na stronie https://github.com/flipagram/android-assetcopier .
źródło
Istnieją zasadniczo dwa sposoby, aby to zrobić.
Po pierwsze, możesz użyć AssetManager.open i, jak opisano przez Rohith Nandakumar i iterować po strumieniu wejściowym.
Po drugie, możesz użyć AssetManager.openFd , który pozwala na użycie FileChannel (który ma [transferTo] ( https://developer.android.com/reference/java/nio/channels/FileChannel.html#transferTo(long , long, java.nio.channels.WritableByteChannel)) i [transferFrom] ( https://developer.android.com/reference/java/nio/channels/FileChannel.html#transferFrom(java.nio.channels.ReadableByteChannel , długie, długie)))), więc nie musisz samodzielnie zapętlać strumienia wejściowego.
Opiszę tutaj metodę openFd.
Kompresja
Najpierw musisz upewnić się, że plik jest przechowywany bez kompresji. System pakowania może wybrać kompresję dowolnego pliku z rozszerzeniem, które nie jest oznaczone jako noCompress , a skompresowanych plików nie można zmapować w pamięci, więc będziesz musiał polegać na AssetManager.open w takim przypadku .
Możesz dodać rozszerzenie „.mp3” do swojego pliku, aby zatrzymać kompresję, ale właściwym rozwiązaniem jest zmodyfikowanie pliku app / build.gradle i dodanie następujących wierszy (aby wyłączyć kompresję plików PDF)
Pakowanie plików
Zauważ, że program pakujący wciąż może spakować wiele plików w jeden, więc nie możesz po prostu odczytać całego pliku, który daje Ci AssetManager . Musisz zapytać AssetFileDescriptor które części potrzebujesz.
Znalezienie właściwej części spakowanego pliku
Po upewnieniu się, że plik jest przechowywany nieskompresowany, możesz użyć metody AssetManager.openFd , aby uzyskać AssetFileDescriptor , którego można użyć do uzyskania FileInputStream (w przeciwieństwie do AssetManager.open , który zwraca InputStream ), który zawiera FileChannel . Zawiera także początkowe przesunięcie (getStartOffset) i rozmiar (getLength) , których potrzebujesz, aby uzyskać poprawną część pliku.
Realizacja
Przykładowe wdrożenie podano poniżej:
Ta odpowiedź jest oparta na odpowiedzi JPM .
źródło
zmień części kodu w następujący sposób:
poprzedni przykład dotyczy plików PDF, w przypadku np. .txt
źródło
Użyj AssetManager , pozwala odczytać pliki w zasobach. Następnie użyj zwykłego Java IO, aby zapisać pliki na sdcard.
Google jest twoim przyjacielem, poszukaj przykładu.
źródło
Cześć chłopaki, zrobiłem coś takiego. Dla N-tej głębokości skopiuj folder i pliki do skopiowania. Który pozwala skopiować całą strukturę katalogów do skopiowania z Android AssetManager :)
Na koniec utwórz asynctask:
nazwij to ze swojej działalności:
źródło
Niewielka modyfikacja powyższej odpowiedzi w celu rekurencyjnego skopiowania folderu i dostosowania go do niestandardowego miejsca docelowego.
źródło
W oparciu o rozwiązanie Rohitha Nandakumara zrobiłem coś własnego, aby skopiować pliki z podfolderu zasobów (tj. „ Asset / MyFolder ”). Sprawdzam też, czy plik już istnieje w sdcard, zanim spróbuję ponownie skopiować.
źródło
To zdecydowanie najlepsze rozwiązanie, jakie udało mi się znaleźć w Internecie. Użyłem następującego linku https://gist.github.com/mhasby/026f02b33fcc4207b302a60645f6e217 ,
ale miał jeden błąd, który naprawiłem, a potem działa jak urok. Oto mój kod. Możesz go łatwo używać, ponieważ jest to niezależna klasa Java.
Jak widać, po prostu stwórz instancję
CopyAssets
w swojej klasie Java, która ma aktywność. Teraz ta część jest ważna, jeśli chodzi o moje badania i poszukiwania w internecieYou cannot use AssetManager if the class has no activity
. Ma to coś wspólnego z kontekstem klasy java.Teraz
c.copyAssets(getApplicationContext())
jest to łatwy sposób na dostęp do metody, gdziec
jest i instancjaCopyAssets
klasy. Zgodnie z moimi wymaganiami zezwoliłem programowi na skopiowanie wszystkich plików zasobów zasset
folderu do/www/resources/
mojego katalogu wewnętrznego.Możesz łatwo znaleźć część, w której musisz dokonać zmian w katalogu zgodnie z przeznaczeniem. Jeśli potrzebujesz pomocy, wyślij mi ping.
źródło
Dla tych, którzy aktualizują się do Kotlin:
Postępując zgodnie z tymi krokami, aby uniknąć
FileUriExposedExceptions
, załóżmy, że użytkownik udzieliłWRITE_EXTERNAL_STORAGE
uprawnienia, a plik jest wassets/pdfs/mypdf.pdf
.źródło