0

数百キロバイトサイズのoggファイルをユーザーのSDカードにコピーする必要があるアプリを公開しました。すぐにエラーレポートが届きました。私に関する限り、問題はパスがその特定の電話に適していないことが原因である可能性があります。

String path = "/sdcard/file.ogg"; 

            File file = new File(Environment.getExternalStorageDirectory(), "file.ogg" );
            if (!file.exists()) {


                InputStream in = getResources().openRawResource(R.raw.file);
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream(path);
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                byte[] buff = new byte[1024];
                int read = 0;

                try {
                    while ((read = in.read(buff)) > 0) {
                        out.write(buff, 0, read);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    try {
                        in.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    try {
                        out.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

したがって、レポートは次のとおりです。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.caodeveloping.androgangnam/com.caodeveloping.androgangnam.Main}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
at android.app.ActivityThread.access$1500(ActivityThread.java:121)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.caodeveloping.androgangnam.Main.onCreate(Main.java:388)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
... 11 more

そして、388行目はout.close()です。/ sdcard /がその電話の適切なパスではない可能性はありますか?何が原因でしょうか?前もって感謝します!

更新、これ?

String path= Environment.getExternalStorageDirectory().getAbsolutePath();
path += "/file.ogg";
4

1 に答える 1

1

2つの問題:

a)明らかに、ファイル(out.close())を閉じようとしていますが、開くことができなかった場合はイベントが発生します

b)ハードコードされたディレクトリ名 "/ sdcard"の代わりに、Environment.getExternalStorageDirectory()を使用することをお勧めします。SDカードがこのパスにマウントされる保証はありません。それがまさにEnvironment.getExternalStorageDirectory()APIの理由です。

また、エラー処理についてこのコード全体を確認することをお勧めします(何かを開くことができない場合、読み取ることができない場合など)

于 2012-11-02T22:14:12.827 に答える