0

画像を SD カードに保存したいのですが、SD カードには画像ファイルの名前を付けたフォルダーしか作成されず、実際のファイルは SD カードに作成されていません。その画像を保存しようとすると、ヌル ポインター例外が発生します。 SDカードに。コードは次のとおりです。

public class MainActivity extends Activity {
    ImageView bmImage; 
    LinearLayout view1;
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          view1 = (LinearLayout)findViewById(R.id.certlinear);
          bmImage = (ImageView)findViewById(R.id.certimage);

        Button button =(Button)findViewById(R.id.btn);
        button.setOnClickListener(hello);

    }
        Button.OnClickListener hello= new Button.OnClickListener()
        {  
            @Override  
            public void onClick(View v)
            {   
                  View view = view1.getRootView();
                  //u can use any view of your View instead of TextView

                 if(view!=null)
                 {
                 System.out.println("view is not null.....");
                 view.setDrawingCacheEnabled(true);
                 view.buildDrawingCache();
                 Bitmap bm = view.getDrawingCache();

                 try
                 {
                 if(bm!=null)
                 {
                 System.out.println("bm is not null.....");
                 OutputStream fos = null;
                 File folder = new File(Environment.getExternalStorageDirectory().toString() + "/sample.JPEG");
                 boolean success = false;
                 if (!folder.exists()) {
                     success = folder.mkdirs();
                 }
                 if (!success) {
                     // Do something on success
                 } else {
                     // Do something else on failure 
                 }
                 Toast.makeText(MainActivity.this,"path of the folder is "+folder.getAbsolutePath(), Toast.LENGTH_SHORT).show();

                 fos = new FileOutputStream(folder);

                 BufferedOutputStream bos = new BufferedOutputStream(fos);
                 bm.compress(Bitmap.CompressFormat.JPEG, 50, bos);

                 bos.flush();
                 bos.close();
                 view.setDrawingCacheEnabled(false);
                 }
                 }
                 catch(Exception e)
                 {
                 System.out.println("Error="+e);
                 e.printStackTrace();
                 }
                 }

            }
        };
}

これは例外ログです:

09-13 18:44:18.957: W/System.err(3612): java.io.FileNotFoundException: /sdcard/sample.JPEG
09-13 18:44:18.967: W/System.err(3612):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:244)
09-13 18:44:18.967: W/System.err(3612):     at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
09-13 18:44:18.967: W/System.err(3612):     at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
09-13 18:44:18.976: W/System.err(3612):     at com.example.mytest.MainActivity$1.onClick(MainActivity.java:96)
09-13 18:44:18.976: W/System.err(3612):     at android.view.View.performClick(View.java:2364)
09-13 18:44:18.976: W/System.err(3612):     at android.view.View.onTouchEvent(View.java:4179)
09-13 18:44:18.976: W/System.err(3612):     at android.widget.TextView.onTouchEvent(TextView.java:6541)
09-13 18:44:18.976: W/System.err(3612):     at android.view.View.dispatchTouchEvent(View.java:3709)
09-13 18:44:18.976: W/System.err(3612):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.987: W/System.err(3612):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.987: W/System.err(3612):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.987: W/System.err(3612):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.997: W/System.err(3612):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
09-13 18:44:18.997: W/System.err(3612):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
09-13 18:44:18.997: W/System.err(3612):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
09-13 18:44:18.997: W/System.err(3612):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
09-13 18:44:18.997: W/System.err(3612):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
09-13 18:44:18.997: W/System.err(3612):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-13 18:44:18.997: W/System.err(3612):     at android.os.Looper.loop(Looper.java:123)
09-13 18:44:18.997: W/System.err(3612):     at android.app.ActivityThread.main(ActivityThread.java:4363)
09-13 18:44:19.011: W/System.err(3612):     at java.lang.reflect.Method.invokeNative(Native Method)
09-13 18:44:19.011: W/System.err(3612):     at java.lang.reflect.Method.invoke(Method.java:521)
09-13 18:44:19.011: W/System.err(3612):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-13 18:44:19.011: W/System.err(3612):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-13 18:44:19.011: W/System.err(3612):     at dalvik.system.NativeStart.main(Native Method)

この行でヌルポインタ例外が発生しています:

   fos = new FileOutputStream(folder);

前もって感謝します。

4

4 に答える 4

3

あなたが呼ぶ

success = folder.mkdirs();

これにより、/ sdcard(存在する)という名前のフォルダーと/sdcard/sample.JPEGという名前のフォルダーが作成されます。イメージを書き込むパスはディレクトリです。ディレクトリでOutputStreamを開くことはできません。

于 2012-09-13T13:30:05.550 に答える
3

この権限を追加しましたか

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2012-09-13T13:29:03.950 に答える
1

コードを簡単に変更するだけで、次のように試してください。

File folder = new File(Environment.getExternalStorageDirectory().toString());
boolean success = false;
if (!folder.exists()) {
    success = folder.mkdirs();
}

File file = new File(Environment.getExternalStorageDirectory().toString() + "/sample.JPEG");
if (!file.exists()) {
    success = file.createNewFile();
}
于 2012-09-13T13:32:34.713 に答える
0

これは私のプロジェクトでうまくいきます:

private void saveChicaDress(Bitmap dress){

        String path = Environment.getExternalStorageDirectory().toString() + 
                        getResources().getString(R.string.path_to_store);

        OutputStream fOut = null;
        File file = new File(path, "chica.png");

        int i = 1;  
        while(file.exists()){
            file = new File(path, "chica("+String.valueOf(i)+").png");
            ++i;
        }

        file.getParentFile().mkdirs();

        try {
            fOut = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        dress.compress(Bitmap.CompressFormat.PNG, 100, fOut);

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

そしてAndroidManifestで:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2012-09-13T13:37:43.323 に答える