3

したがって、私のアプリには、ActionDialog単純なキャンセル ボタンと保存ボタンを備えたインターフェイスとして空白のキャンバスを含む があります。起こっていることは、簡単な図で最もよく示されています

以前の画面構成

-(TextView)-(ImageView)-(Button)-

次に、ユーザーがボタンを押すと、ActionDialog署名を要求するポップアップが表示されます。彼らが署名すると、キャプチャされた図面が保存されます。次に、メモリを介して図面にアクセスし、元の場所ImageViewbitmap. しかし、これは結局起こることです

変更後の画面構成

- - - - - なし - - - - - - -

それらは消えてしまい、私の中にエラーが表示されますlogcat:

05-14 19:06:27.004: E/Error(25274): java.io.FileNotFoundException: /storage/emulated/0signature.png: open failed: EACCES (Permission denied)
05-14 19:06:27.004: E/BitmapFactory(25274): Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0signature.png: open failed: ENOENT (No such file or directory)

java.io.FileNotFoundException: /storage/emulated/0signature.png: オープンに失敗しました: ENOENT (そのようなファイルまたはディレクトリはありません)

ただし、プログラムがクラッシュすることはありません。とにかく、ここにファイルのコードがあります

アクションダイアログ

public class CaptureSignature extends DialogFragment {
Sign sign;
View view;

public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder capSig = new AlertDialog.Builder(getActivity());

    capSig.setView(sign = new Sign(this.getActivity(), null))
            .setMessage(R.string.store_question)
            .setPositiveButton(R.string.save,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            try {
                                sign.setDrawingCacheEnabled(true);
                                sign.getDrawingCache()
                                        .compress(
                                                Bitmap.CompressFormat.PNG,
                                                10,
                                                new FileOutputStream(
                                                        new File(
                                                                getActivity()
                                                                        .getExternalFilesDir(
                                                                                "img"),
                                                                "signature.png")));
                            } catch (Exception e) {
                                Log.e("Error ", e.toString());
                            }
                            File mysig = new File(getActivity()
                                    .getExternalFilesDir("img"),
                                    "signature.png");
                            ImageView sig = (ImageView) getActivity()
                                    .findViewById(R.id.sig_image);
                            Bitmap bmp = BitmapFactory.decodeFile(mysig
                                    .getAbsolutePath());
                            sig.setImageBitmap(bmp);

                        }
                    })

            .setNegativeButton(R.string.cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                        }
                    });

    // Create the Dialog object and return it
    return capSig.create();
}
}

だから明らかに私はこれをどこかで台無しにしました。誰かが何か洞察を持っているなら、私は感謝します。ありがとう!

個人的には、これを間違って保存しているか、Sign を正しく宣言していないかのどちらかだと思いdrawing cacheます。

編集 私はこれを宣言しましたManifest

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

2回目の編集

新しいコードと logcat を表示し、エラーが変更されました

最終編集

Matt Giles と JRowan に感謝します。これには気が狂いそうになりました。現在は動作しており、上記のコードは最終バージョンです。

4

1 に答える 1

3

問題は次の行です。

new File(Environment.getExternalStorageDirectory().getPath() + "signature.png"

への呼び出しgetPath()は、末尾に「/」がないパスを返します。したがって、エラー メッセージのファイル パスは/storage/emulated/0signature.png/storage/emulated/0/signature.png.

SD カードのルート ディレクトリにファイルを配置するのではなく、アプリケーション固有のストレージを使用することをお勧めします。new File(...)現在の呼び出しの代わりに、次を使用します。

new File(getActivity().getExternalFilesDir("img"), "signature.png")

getExternalFilesDir(name)アプリケーション専用の「name」というフォルダーを作成します。これにより、アプリが SD カードのルート ディレクトリを乱雑にするのを防ぐことができます。

于 2013-05-14T22:48:56.817 に答える