1

オーディオプレーヤーアプレットに取り組んでいますが、Webブラウザで実行するのに問題があります。Eclipseのアプレットビューアでは完全に機能しますが、GoogleChromeで試してみると機能しません。eclipseが作成する生成されたアプレットファイルも試しましたが、それも機能しません。おそらく、eclipseがそれを実行する方法と関係があります。

これはhtmlファイルですが、mp3ファイルまたは私が作成した特別なフォントにアクセスすることは許可されていません。

<html>

<meta http-equiv="Content-Type" content="text/html; charset=MacRoman"/>

<body>

<applet code="DOSPlayer.class" archive="DOSPlayer.jar, basicplayer3.0.jar, commons-logging-1.1.1.jar, mp3spi1.9.5.jar, tritonus_share-0.3.6.jar, jl1.0.1.jar" width="450" height="350" >

</applet>

</body>

</html>

私が得ているエラーは、アクセス許可のためにファイルにアクセスできないためです。

java.security.AccessControlException: access denied (java.io.FilePermission fonts\DOSFont.ttf read)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkRead(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at DOSPlayer.initFont(DOSPlayer.java:398)
    at DOSPlayer.<init>(DOSPlayer.java:413)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
java.lang.reflect.InvocationTargetException
    at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.runOnEDT(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.io.FilePermission mp3 read)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkRead(Unknown Source)
    at java.io.File.list(Unknown Source)
    at java.io.File.listFiles(Unknown Source)
    at DOSPlayer.getFiles(DOSPlayer.java:259)
    at DOSPlayer.<init>(DOSPlayer.java:415)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Exception: java.lang.reflect.InvocationTargetException

エラーは次の2つのコードスニペットから発生していることがわかります。

     //path is "mp3/"
public String[] getFiles(String path) {

              String[] songs = new String[501];
              String files;
              File folder = new File(path);
              File[] listOfFiles = folder.listFiles(); 
              //gets all mp3 files within mp3 folder
             try {
              for (int i = 0; i < listOfFiles.length; i++) {

               if (listOfFiles[i].isFile()) 
               {
               files = listOfFiles[i].getName();
                    if (files.endsWith(".mp3")) {
                            songs[songNum] = files;
                            songNum++;
                            playableSongs++;
                    }
                 }
              }
             } catch (Exception e) {
                 System.out.println("Error Here");
                 e.printStackTrace();
                 return null;
             }
              return songs;


}

/////////////////////////////////

public void initFont() {
        try {
            //URL fontUrl = new URL("fonts/DOSFont.ttf");
            File file = new File("fonts/DOSFont.ttf"); // where ever it is from

            FileInputStream fontPath = new FileInputStream(file);
            dosFont = Font.createFont(Font.TRUETYPE_FONT, fontPath);//fontUrl.openStream());
            dosFont = dosFont.deriveFont(Font.PLAIN,19);
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(dosFont);
            font = true;
                } catch(Exception e) {
                    e.printStackTrace();
                    font = false;
                }
    }

アプレットに署名しようとしましたが、機能しません。Webページからアプレットを表示している人のファイルへのアクセスが許可されます。ポリシーファイルを編集しようとしましたが、それを機能させることができませんが、それでもオプションである可能性があります。

私はこれに何時間も問題を抱えていて、何をすべきかわからないので、どんな助けでも大歓迎です。

4

1 に答える 1

2

これらのリソース (特にフォント) は事実上、Jar に追加してアプレットのランタイム クラス パスに追加できる「アプリケーション リソース」です。アーカイブにない場合は、サーバー上のパブリックな場所 (ブラウザーから直接アクセスできる場所) に追加する必要があります。

Jar またはサーバーに格納されると、URL でアクセスできます。URL は、Jar に埋め込まれていない場合、コードまたはドキュメント ベースへの相対パスとして形成できます。それらが Jar にある場合は、次のようなものを使用して URL を取得します。

URL urlToFont = this.getClass().getResource("/path/in/jar/to/the.ttf");

ポリシーファイルも編集してみましたが、うまくいきませんでしたが、それでもオプションになる可能性があります。

いいえ、できません。ポリシー ファイルは、非常に限られた範囲のものに適しています。パブリックに展開されたアプレットはその 1 つではありません。


そして、簡単なコメント..

File[] listOfFiles = folder.listFiles(); 

それは再考する必要があります。アプレットは、サーバーの助けがなければ、サーバー上のファイルのリストを取得できません。ファイルのグループを定義するために、アプレットには通常、パス/名前を受け入れるパラメーターがあります。

于 2012-08-09T00:20:19.727 に答える