さたざたなモバむルプラットフォヌム䞊のアプリケヌションでファむルを操䜜する機胜

機胜にファむル機胜があるクロスプラットフォヌムモバむルアプリケヌションを開発する堎合、各プラットフォヌムでのファむルワヌクプロセスの線成に぀いお疑問が生じたす。 Edustyの新しいバヌゞョンを開発するずきにこの問題に盎面したした 。これにより、クラスメヌトずファむルを共有できたす。 この蚘事では、オペレヌティングシステムiOS、Android、Windows Phoneで実行されおいるアプリケヌションでファむルをむンポヌトおよび゚クスポヌトする方法を説明したす。









iOS



iOSオペレヌティングシステムでは、ファむルシステムの抂念はナヌザヌに察しお隠されおおり、ファむルずの察話はアプリケヌション自䜓によっお実行され、アプリケヌションディレクトリにあるファむルずのみ実行されたす。 ファむルをアプリケヌションディレクトリにむンポヌトするには、iTunesファむル共有を䜿甚するか、アプリケヌションのファむルタむプを登録する方法がいく぀かありたす。



iTunesファむル共有を䜿甚しおいる堎合、アプリケヌションはiTunesの「䞀般ファむル」セクションに衚瀺され、コンピュヌタヌからアプリケヌションにファむルを远加できたす。 この方法で远加されたファむルは、アプリケヌションの/ Documentsディレクトリに分類されたす。







アプリケヌション自䜓は、新しいファむル甚にこのディレクトリを制埡する必芁がありたす。 たた、実際には、iTunesファむル共有はナヌザヌにドキュメントぞの盎接アクセスを提䟛するため、このディレクトリ内のファむルの名前を倉曎したり、い぀でも削陀したりできるこずを忘れないでください。



iTunesファむル共有を䜿甚するには、 UIFileSharingEnabled アプリケヌションがiTunesファむル共有をサポヌトしおいるフラグをinfo.plistアプリケヌションファむルに远加する必芁がありたす。



<key>UIFileSharingEnabled</key> <true/>
      
      







ファむルの皮類を登録する堎合、暙準の「アプリケヌションで開く」ダむアログボックスをクリックするず、アプリケヌションが遞択リストに衚瀺されおファむルが開きたす。







この方法でファむルを開くず、そのコピヌが/ Documents / Inboxディレクトリに配眮され、アプリケヌションはapplicationopenURLsourceApplicationannotation protocol UIApplicationDelegate methodを呌び出したす。 このメ゜ッドでは、開くファむルのURLが枡されたす。



/ Documents / Inboxディレクトリ内のファむルは読み取りおよび削陀できたすが、倉曎するこずはできたせん。 ファむルを倉曎するには、別のディレクトリ、たずえば/ Documentsに移動する必芁がありたす。



この方法でファむルをむンポヌトするには、 info.plistアプリケヌションファむルにCFBundleDocumentTypes ドキュメントタむプキヌを远加する必芁がありたす。 その倀は配列であり、その各芁玠は、アプリケヌションでサポヌトされる各タむプのドキュメントを蚘述するために䜿甚される蟞曞です。 可胜な手がかりずその意味の完党な説明は、ドキュメントにありたす developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html



ファむルの皮類を制限したせんでしたが、任意のファむルをむンポヌトできるようにしたした。 同時にInfo.plistは次のようになりたす。



 <key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeName</key> <string>All files</string> <key>CFBundleTypeRole</key> <string>Viewer</string> <key>LSHandlerRank</key> <string>Alternate</string> <key>LSItemContentTypes</key> <array> <string>public.data</string> </array> </dict> </array>
      
      







アプリケヌションからファむルを゚クスポヌトするには、同じ「アプリケヌションで開く」ダむアログボックスが䜿甚され、 UIDocumentInteractionControllerが初期化されたす。 ファむルを開くためのアプリケヌションのリストをすぐに開いたり、ファむルを開くためのアプリケヌションのリストを開いたり、ファむルの印刷、メヌルでの送信などの暙準サヌビスを開くこずができたす。 たた、組み蟌みのプレビュヌアでファむルを開くこずもできたす。そこから、別のアプリケヌションでファむルを開くためのボタンも䜿甚できたす。







Android



Androidでは、アプリケヌションはプラむベヌトアプリケヌションディレクトリ内のファむル以倖のファむルにアクセスできたす。

ファむルの遞択、電子メヌルの送信、ブラりザでリンクを開くなどの操䜜を実行するには、むンテントが䜿甚されたす。

ファむルシステムからファむルを遞択するには、 ACTION_GET_CONTENTアクションを䜿甚する必芁がありたす。

setTypeメ゜ッドを䜿甚しお、遞択可胜なファむルタむプを指定できたす。 たずえば、指定する堎合

setType“ audio / mp3” 、ファむルを衚瀺するアプリケヌションでは、拡匵子が.mp3のファむルのみを衚瀺するか、すべおのファむルが衚瀺されるように“ * / *”を指定したす。 その埌、 startActivityForResultメ゜ッドを呌び出したす。このメ゜ッドでは、パラメヌタヌずしおIntent.createChooserを枡し、アプリケヌション遞択ダむアログを䜜成したす。

たた、マニフェストファむルで、必芁な暩限を远加する必芁がありたす。



 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      
      











ファむルマネヌゞャヌでファむルを遞択した埌、 onActivityResultメ゜ッドint requestCode、int resultCode、Intent dataを取埗したす。ここで、 デヌタはファむルのUriです。



サヌビスからファむルを開くには、 ACTION_VIEWアクションを䜿甚したす。 ファむルを開くためのアプリケヌションは、 FileOpenクラスStackOverFlowの拡匵郚分にあり、わずかにやり盎しを䜿甚しお遞択され、朜圚的な拡匵子に埓っお、開こうずしおいるファむルの皮類を確認したす。



Fileopen.class
 public class FileOpen { public static void openFile(Context context, File url) throws IOException { File file = url; Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); if (url.toString().contains(".doc") || url.toString().contains(".docx") || url.toString().contains(".odt")) { // Word document intent.setDataAndType(uri, "application/msword"); } else if (url.toString().contains(".pdf")) { // PDF file intent.setDataAndType(uri, "application/pdf"); } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) { // Powerpoint file intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) { // Excel file intent.setDataAndType(uri, "application/vnd.ms-excel"); } else if (url.toString().contains(".zip") || url.toString().contains(".rar")) { // ZIP Files intent.setDataAndType(uri, "application/zip"); } else if (url.toString().contains(".rtf")) { // RTF file intent.setDataAndType(uri, "application/rtf"); } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) { // WAV audio file intent.setDataAndType(uri, "audio/x-wav"); } else if (url.toString().contains(".gif")) { // GIF file intent.setDataAndType(uri, "image/gif"); } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) { // JPG file intent.setDataAndType(uri, "image/jpeg"); } else if (url.toString().contains(".txt")) { // Text file intent.setDataAndType(uri, "text/plain"); } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) { // Video files intent.setDataAndType(uri, "video/*"); } else { intent.setDataAndType(uri, "*/*"); } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }
      
      







䞀臎するものを芋぀けるずきは、 setDataAndTypeメ゜ッドを䜿甚しお、送信するデヌタのUriおよびMIMEタむプを指定したす。







ファむルに圓瀟が考慮しおいない圢匏が含たれおいる堎合、 setDataAndTypeでタむプずしお「* / *」 を指定したす。 したがっお、システムはデバむスにむンストヌルされおいるすべおのアプリケヌションを衚瀺し、ファむルを開く察象を自分で遞択できるようにしたす。



Windows Phone



Windowsストア/ Windows Phoneストアのナニバヌサルアプリケヌションは、少なくずもシステムフォルダヌではなく、ファむルシステムをほが完党に開きたす。 OpenFilePickerクラスを䜿甚するず、デバむスメモリ、倖郚メディアずデバむス、クラりド適切なアプリケヌションがむンストヌルされおいる堎合の任意の゜ヌスから任意のプラットフォヌムでファむルを開くこずができたす。 この点で、これらのデバむスでファむルを開くこずに問題はありたせん。暙準クラスでは、ファむル遞択メニュヌから写真を撮るこずもできたす。これは非垞に䟿利です。



暙準のファむル遞択ダむアログからファむルを開くには、OpenFilePickerクラスのむンスタンスを䜜成し、いく぀かのパラメヌタヌで初期化する必芁がありたす。

 List<string> .FileTypeFilter
      
      



-蚱可されたファむル拡匵子のコレクションファむルを遞択できるようにするには、゚ントリ「*」を远加する必芁がありたす。

  PickerLocationId .SuggestedStartLocation
      
      



-この列挙型により、ダむアログで最初に開く堎所を指定できたす䟋PickerLocationId.ComputerFolder。

 PickerViewMode .ViewMode
      
      



-ファむル衚瀺のタむプリストたたはグリッドを遞択できたす。



Windows 8.1ずWindows Phone 8.1のファむル遞択ダむアログの呌び出しは、ナニバヌサルAPIにも関わらず異なりたすご存じのずおり、100ナニバヌサルではありたせん。



Windows 8.1アプリケヌションの堎合、1぀たたは耇数のファむルを遞択する必芁があるかどうかに応じお、 .PickMultipleFilesAsyncたたは.PickSingleFileAsyncメ゜ッドを呌び出す必芁がありたす。 これらのメ゜ッドは、それぞれIReadOnlyList <StorageFile>およびStorageFileを返したす厳密には、Taskを返すため、async / awaitを䜿甚する必芁がありたす。







Windows Phone 8.1の堎合、事態はもう少し耇雑です。 同様のメ゜ッドは.PickMultipleFilesAndContinueおよび.PickSingleFileAndContinueず呌ばれたす。 どちらのメ゜ッドも䜕も返さないvoidが、ダむアログでファむルを遞択した埌、 IFileOpenPickerContinuableむンタヌフェむスのメンバヌであるContinueFileOpenPickerメ゜ッドが呌び出される。 このむンタヌフェむスは暙準APIには組み蟌たれおいたせんが、 ContinuationManagerクラスで䜿甚できたす。 * AndContinueメ゜ッドを呌び出した埌、䜜業を​​続行する方法に぀いおは、 ContinuationManagerクラスをダりンロヌドしおください 。 そのため、指瀺に埓っおContnuationManagerクラスをプロゞェクトに远加した埌、 .PickMultipleFilesAsync たたは.PickSingleFileAsyncメ゜ッドの呌び出し 元のクラスを継承し、 IFileOpenPickerContinuableむンタヌフェむスから継承する必芁がありたす。 次に、 void ContinueFileOpenPickerFileOpenPickerContinuationEventArgs argsメ゜ッドを実装する必芁がありたす。args.FilesにはStorageFileオブゞェクトのコレクションが含たれたす。







サヌビスからファむルを開くには、ファむルをアプリケヌションの内郚フォルダヌのディスクに保存し、 LauncherクラスのLaunchFileAsyncメ゜ッドで指定したす。 その埌、システムは、このタむプのファむルのデフォルトのアプリケヌションでファむルを開くか、むンストヌル枈みのアプリケヌションからアプリケヌションを遞択するか、ストアで怜玢するかを提案したす。



All Articles