0

현재 음악 플레이어에서 재생할 파일의 다운로드가 포함 된 코드바 테스트 프로젝트를 진행하고 있습니다. 기본적으로 응용 프로그램은 내 서버에서 .mp3 파일을 다운로드하고 응용 프로그램 저장소 또는 사용자 정의 경로 (폴더 선택)에 저장해야합니다. 현재 파일을 성공적으로 다운로드하고 있으며, 사용자 지정 경로를 선택하고 파일 탐색기 응용 프로그램에서 음악 파일을 재생할 수 있지만 어떻게 든 음악 플레이어 응용 프로그램이나 다른 곳에 나타나지 않습니다. 또한, 설정 파일에 외부 액세스를 정의한 경우에도 파일을 sdcard에 쓸 수 없습니다. 파일 시스템을 액세스 할 수 내 현재 코드처럼 보이는 다음Cordova : Android에서 sdcard 액세스가 작동하지 않습니다.

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 }
어떻게 든

이 모든 cordova.file.external * directorys이 (플러그인 md로 파일에 언급 된 것처럼) 널 (null)이며, externalRootDirectory가 "storage/emulated/0/appdir"을 반환합니다 (sdcard 경로를 반환해야 함). 나는 다음과 같이 config.xml에와의 AndroidManifest.xml에 권한을 확인했다 :

<?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>
응용 프로그램 설치에 이러한 권한을 요청하는 사실이다. 나는 또한 sdcard 경로를 수동으로 선택하는 해결 방법 (folderpicker)을 구현했습니다. 슬프게도 내가 실패 할 때 내 getDirectory 함수를 사용해보십시오.

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 },

는 이미 trought 많은 유래 페이지와 문서를 검색 한하지만 난 어떤 해결책을 마련하지 않았다. 최신 cordova 6.5를 설치했으며 모든 플러그인을 최신 stable 릴리스로 업데이트했습니다. 나는 어떤 조언을해도 행복하다.

업데이트 : 더 명확하게하기 위해, 응용 프로그램의 사용자는 자신이 사용하고 관리 앱 throught를을 열 수 없습니다로 다운로드 한 미디어 파일을 사용할 수 있어야합니다.

답변

0

here을 살펴보십시오. 플러그인 cordova-plugin-file-opener2이이 문제를 해결했습니다!

+0

이 문제가 어떻게 해결되는지 잘 모르겠습니다. 문제는 다운로드 한 파일을 음악 플레이어와 같은 다른 응용 프로그램에서 샌드 박스처럼 인식하지 못하는 것입니다. 나는 에뮬레이트 된 대신에 영구적 인 위치를 얻기 위해 resolveFileSystem 대신에 resolveLocalFileSystemURL을 사용해야한다는 것을 읽었지만 이것도 작동하지 않았다. – user285814

+0

@ user285814'opener2'는 에뮬레이트 된 위치를 영구적으로 변환합니다. 필자의 경우에는 시스템이'PDF's'와'MP3'을 올바르게 열었습니다. 당신이 원하는 것은'MIME TYPE'을 전달하는 것입니다. –

+0

보세요 : https://github.com/pwlin/cordova-plugin-file-opener2 –