0

J'essaie actuellement un projet de test cordova qui contient le téléchargement d'un fichier à jouer sur le lecteur de musique par la suite. Fondamentalement, l'application doit télécharger un fichier .mp3 à partir de mon serveur et l'enregistrer dans le stockage de l'application ou un chemin défini par l'utilisateur (sélection de dossier). A partir de maintenant, je télécharge le fichier avec succès, je suis en mesure de sélectionner le chemin personnalisé et de lire les fichiers musicaux dans l'application Explorateur de fichiers, mais ils n'apparaissent pas dans l'application Music Player ou ailleurs. En outre, même si j'ai défini un accès externe dans les fichiers de configuration, je ne peux pas écrire de fichiers sur la carte SD. Mon code actuel pour accéder au système de fichier se présente comme suit:Cordova: accès carte SD sur Android ne fonctionne pas

app.log('Filesystem', 'Requesting filesystem...'); 
 
\t \t if (device.platform.toLowerCase() == "android") { 
 
\t \t \t app.log('Filesystem', 'Detected android device...'); 
 
\t \t \t if(window.saveInMusic && window.musicPath){ 
 
\t \t \t \t app.log('Filesystem', 'Selected storage persistent SD'); 
 
\t \t \t \t window.resolveLocalFileSystemURL(window.musicPath, app.gotFS, app.fsFail); 
 
\t \t \t } else { 
 
\t \t \t \t app.log('Filesystem', 'Selected storage persistent Internal'); 
 
\t \t \t \t window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, app.gotFS, app.fsFail); 
 
\t \t \t } 
 
\t \t } else { 
 
\t \t \t app.log('Filesystem', 'No device detected...'); 
 
\t \t \t app.log('Filesystem', 'Selected storage DEFAULT (sandbox)'); 
 
\t \t \t window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, app.gotFS, app.fsFail); 
 
\t \t }

D'une certaine façon, tous les cordova.file.external * directorys sont nuls (comme mentionné dans le fichier plugins md) et le externalRootDirectory retourne "storage/emulated/0/appdir" (devrait renvoyer le chemin de sdcard). J'ai vérifié les autorisations dans config.xml et AndroidManifest.xml qui ressemblent à ce qui suit:

<?xml version='1.0' encoding='utf-8'?> 
 
<widget id="com.someorg.appname" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> 
 
    <name>AppName</name> 
 
    <description> 
 
     A basic Framework7 template for PhoneGap. 
 
    </description> 
 
    <author email="[email protected]" href="http://cordova.io"> 
 
     Apache Cordova Team 
 
    </author> 
 
    <content src="index.html" /> 
 
    <access origin="*" /> 
 
    <allow-intent href="http://*/*" /> 
 
    <allow-intent href="https://*/*" /> 
 
    <allow-intent href="tel:*" /> 
 
    <allow-intent href="sms:*" /> 
 
    <allow-intent href="mailto:*" /> 
 
    <allow-intent href="geo:*" /> 
 
    <platform name="android"> 
 
     <preference name="android-minSdkVersion" value="14" /> 
 
\t \t <preference name="AndroidPersistentFileLocation" value="Compatibility" /> 
 
\t \t <preference name="AndroidExtraFilesystems" value="sdcard,cache" /> 
 
     <allow-intent href="market:*" /> 
 
    </platform> 
 
    <platform name="ios"> 
 
     <allow-intent href="itms:*" /> 
 
     <allow-intent href="itms-apps:*" /> 
 
     <preference name="BackupWebStorage" value="none" /> 
 
    </platform> 
 
    <preference name="DisallowOverscroll" value="true" /> 
 
    <plugin name="cordova-plugin-whitelist" spec="~1.2.0" /> 
 
    <plugin name="cordova-plugin-console" spec="~1.0.1" /> 
 
    <plugin name="cordova-plugin-statusbar" spec="~1.0.1" /> 
 
\t <plugin name="cordova-plugin-compat" spec="~1.1.0" /> 
 
\t <plugin name="cordova-plugin-device" spec="~1.1.5" /> 
 
\t <plugin name="cordova-plugin-file" spec="~4.3.2" /> 
 
\t <plugin name="cordova-plugin-file-transfer" spec="~1.6.2" /> 
 
\t <plugin spec="https://github.com/ourcodeworld/cordova-ourcodeworld-filebrowser.git#96a57ef" source="git" /> 
 
</widget>

<?xml version='1.0' encoding='utf-8'?> 
 
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.someorg.appname" xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> 
 
    <uses-permission android:name="android.permission.INTERNET" /> 
 
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true"> 
 
     <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize"> 
 
      <intent-filter android:label="@string/launcher_name"> 
 
       <action android:name="android.intent.action.MAIN" /> 
 
       <category android:name="android.intent.category.LAUNCHER" /> 
 
      </intent-filter> 
 
     </activity> 
 
     <activity android:label="Our Code World filepicker" android:name="com.ourcodeworld.plugins.filebrowser.DialogShowPicker"> 
 
      <intent-filter> 
 
       <action android:name="com.ourcodeworld.plugins.filebrowser.DialogShowPicker" /> 
 
       <category android:name="android.intent.category.DEFAULT" /> 
 
      </intent-filter> 
 
     </activity> 
 
     <activity android:label="Filepicker" android:name="com.nononsenseapps.filepicker.FilePickerActivity" android:theme="@style/FilePickerTheme"> 
 
      <intent-filter> 
 
       <action android:name="android.intent.action.GET_CONTENT" /> 
 
       <category android:name="android.intent.category.DEFAULT" /> 
 
      </intent-filter> 
 
     </activity> 
 
    </application> 
 
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="25" /> 
 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
 
</manifest>
L'application est en fait demander ces autorisations sur l'installation. J'ai également implémenté une solution de contournement (folderpicker) pour choisir le chemin de carte SD manuellement. Malheureusement quand j'essaye ma fonction de getDirectory sur cela échoue.

gotFS: function(fileSystem){ 
 
\t \t window.fileSystem = fileSystem; 
 
\t \t app.log('Filesystem', 'Filesystem got!'); 
 
\t \t var entry = ""; 
 
\t \t if (device.platform.toLowerCase() == "android") { 
 
\t \t \t entry = fileSystem; 
 
\t \t } else { 
 
\t \t \t entry = fileSystem.root; 
 
\t \t } 
 
\t \t app.log('Filesystem', 'Setting up directory...'); 
 
\t \t entry.getDirectory(window.appRootDirName, { 
 
\t \t \t create: true, 
 
\t \t \t exclusive: false 
 
\t \t }, app.dirReady, app.fsFail); 
 
\t },

J'ai déjà recherché Trought beaucoup de pages stackoverflow et docs, mais je ne suis pas venu avec une solution. J'ai installé le dernier Cordova 6.5 et également mis à jour tous les plugins à la dernière version stable. Je suis heureux pour tout conseil. Pour être plus clair, l'utilisateur de l'application doit pouvoir utiliser les fichiers multimédia téléchargés comme il est habitué et ne pas les gérer et les ouvrir via l'application.

Répondre

0

Jetez un oeil à here. Le plugin cordova-plugin-file-opener2 a résolu ce problème!

+0

Je ne suis pas sûr de savoir comment cela résout le problème. Le problème est que le fichier téléchargé n'est pas reconnu par d'autres applications, comme le lecteur de musique, comme un bac à sable. J'ai lu que je dois utiliser resolveLocalFileSystemURL au lieu de resolveFileSystem pour obtenir un emplacement permanent au lieu d'un émulé, mais cela n'a pas fonctionné non plus. – user285814

+0

@ user285814 le 'opener2' convertit l'emplacement émulé en un permanent, dans mon cas le système a ouvert' PDF's' et 'MP3' correctement. Tout ce que vous faites est de passer le 'MIME TYPE' que vous voulez. –

+0

Jetez un coup d'oeil: https://github.com/pwlin/cordova-plugin-file-opener2 –