บันทึกไฟล์ลงที่จัดเก็บข้อมูลภายในแบบส่วนตัว

ฉันต้องการบันทึกไฟล์ลงในที่จัดเก็บข้อมูลภายในของฉันแบบส่วนตัวเพื่อให้แอปพลิเคชันของฉันเป็นแอปพลิเคชันเดียวที่สามารถเข้าถึงได้ ตามค่าเริ่มต้นของไซต์นักพัฒนาซอฟต์แวร์ Android ไฟล์ที่บันทึกไว้ในที่จัดเก็บข้อมูลภายในจะเป็นส่วนตัวสำหรับแอปพลิเคชันของคุณและแอปพลิเคชันอื่น ๆ ไม่สามารถเข้าถึงได้ พวกเขา (และผู้ใช้ก็ไม่สามารถได้เช่นกัน) อย่างไรก็ตาม เมื่อฉันบันทึกไฟล์โดยใช้ Environment.getExternalStorageDirectory(); ทุกคนสามารถเข้าถึงไฟล์ได้อย่างชัดเจน ฉันได้ลองใช้ getFilesDir() แทน เนื่องจากเห็นได้ชัดว่าจะทำให้ไฟล์ของคุณเป็นส่วนตัว แต่แอปพลิเคชันของฉันยังคงหยุดทำงาน ด้านล่างคือรหัสของฉัน:

public class SaveOpen extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_save_open);
        isSDCardAvailable();


        Button david = (Button) findViewById(R.id.button1);
        david.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                File pdfFile = new File(getFilesDir().getAbsolutePath() + "/MathBarsPDFDocumentTestNew/userg.pdf");
                Uri path = Uri.fromFile(pdfFile);
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.setDataAndType(path, "application/pdf");
                try {

                    startActivity(intent);

                } catch (ActivityNotFoundException e) {
                    // No application to view, ask to download one
                    AlertDialog.Builder builder = new AlertDialog.Builder(
                            SaveOpen.this);
                    builder.setTitle("No Application Found");
                    builder.setMessage("Download one from Android Market?");
                    builder.setPositiveButton("Yes, Please",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent marketIntent = new Intent(Intent.ACTION_VIEW);
                                    marketIntent.setData(Uri
                                            .parse("market://details?id=com.adobe.reader"));
                                    startActivity(marketIntent);
                                }
                            });
                    builder.setNegativeButton("No, Thanks", null);
                    builder.create().show();
                }

            }
        });



    }


    public void isSDCardAvailable(){


        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.toString().equals(state.toString())) {

            //File sdDir = Environment.getExternalStorageDirectory();
            File sdDir = getFilesDir();



            File newdir = new File(sdDir.getAbsolutePath() + "/MathBarsPDFDocumentTestNew");
            newdir.mkdirs();
            File file = new File(newdir, "userg.pdf");

            try {

                FileOutputStream f = new FileOutputStream(file);
                AssetManager assetManager = getAssets();
                InputStream input = assetManager.open("userguide.pdf");

                byte[] buffer = new byte[1024];
                int read;
                while ((read = input.read(buffer)) != -1) {
                    f.write(buffer, 0, read);
                }
                f.close();
                input.close();

            } catch (Exception e) {
                Log.d("Downloader", e.getMessage());
            }





        }else{



            AlertDialog.Builder builder = new AlertDialog.Builder(
                    SaveOpen.this);
            builder.setTitle("No SD Card available");
            builder.setMessage("Please Insert SD Card");

            builder.setNegativeButton("Cancel", null);
            builder.create().show();
        }



        }

    }

มีข้อเสนอแนะอะไรบ้าง? ด้านล่างเป็นแมวบันทึกของฉัน:

03-05 11:02:19.520: I/ActivityManager(164): START {act=android.intent.action.VIEW dat=file:///data/data/com.david.openpdf/files/MathBarsPDFDocumentTestNew/userg.pdf typ=application/pdf flg=0x4000000 cmp=com.adobe.reader/.AdobeReader} from pid 2684
03-05 11:02:19.570: I/ActivityManager(164): START {cmp=com.adobe.reader/.ARViewer (has extras)} from pid 2697
03-05 11:02:19.620: I/ActivityManager(164): Displayed com.adobe.reader/.AdobeReader: +77ms
03-05 11:02:19.660: D/OpenGLRenderer(2684): Flushing caches (mode 0)
03-05 11:02:19.680: V/TabletStatusBar(243): setLightsOn(true)
03-05 11:02:19.700: D/OpenGLRenderer(2684): Flushing caches (mode 1)


03-05 11:02:35.630: E/System(2697): Uncaught exception thrown by finalizer
03-05 11:02:35.630: E/System(2697): java.lang.NullPointerException
03-05 11:02:35.630: E/System(2697):     at com.omniture.AppMeasurementBaseSE13.finalize(AppMeasurementBaseSE13.java:43)
03-05 11:02:35.630: E/System(2697):     at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:182)
03-05 11:02:35.630: E/System(2697):     at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
03-05 11:02:35.630: E/System(2697):     at java.lang.Thread.run(Thread.java:856)
03-05 11:02:35.660: D/dalvikvm(164): GC_CONCURRENT freed 1044K, 26% free 11680K/15751K, paused 2ms+5ms
03-05 11:02:44.640: I/wpa_supplicant(229): wlan0: WPA: Group rekeying completed with 00:1c:b3:ae:95:09 [GTK=CCMP]

และบนหน้าจอของฉันแจ้งว่า Error: The document path is not valid


person DMC    schedule 05.03.2013    source แหล่งที่มา
comment
getFilesDir() เป็นวิธีที่จะช่วยคุณ โปรดโพสต์ logcat ของคุณเมื่อมันขัดข้อง   -  person Emil Adz    schedule 05.03.2013


คำตอบ (1)


หากคุณต้องการประหยัดพื้นที่จัดเก็บข้อมูลภายใน คุณไม่จำเป็นต้องใช้ Environment.getExternalStorageDirectory() แต่คุณควรใช้ getFilesDir() (ส่งคืนไฟล์ที่แสดงถึงไดเร็กทอรีภายในสำหรับแอปของคุณ)

ดูเอกสาร Android อย่างเป็นทางการในหัวข้อที่ค่อนข้างชัดเจน

person Lisa Anne    schedule 05.03.2013
comment
หากคุณดูโค้ดของฉันด้านบน คุณจะเห็นว่าฉันใช้ getFilesDir() แต่มันทำให้แอปพลิเคชันของฉันขัดข้อง - person DMC; 05.03.2013
comment
@ cv82 ฉันเข้าใจแล้ว โปรดโพสต์ LogCat ของคุณ มาดูกันว่า prtoblem อยู่ที่ไหน - person Lisa Anne; 05.03.2013
comment
ฉันได้เพิ่ม logcat ของฉันด้านบนแล้ว - person DMC; 05.03.2013
comment
@ cv82 จนถึงตอนนี้ก็ไม่มีปัญหา... กำลังพยายามแก้ไขจุดบกพร่อง...กรุณาโพสต์โค้ดของกิจกรรมอื่น - person Lisa Anne; 05.03.2013
comment
นี่เป็นกิจกรรมเดียวที่ฉันมีในใบสมัครของฉัน - person DMC; 05.03.2013
comment
@ cv82 คุณพูดถูก ฉันหวังว่าคุณจะทดสอบบนโทรศัพท์จริง (ไม่ใช่ Emulator) และคุณได้ติดตั้งโปรแกรมอ่าน PDF บนโทรศัพท์ของคุณแล้ว... - person Lisa Anne; 05.03.2013
comment
ใช่ ฉันกำลังทดสอบบนแท็บเล็ตและติดตั้ง Adobe Reader ไว้แล้ว - person DMC; 05.03.2013
comment
@ cv82 ฉันไม่มีเลย... จนถึงตอนนี้ฉันช่วยคุณได้เท่านั้น อย่างไรก็ตาม หากคุณชื่นชมคำตอบของฉัน คุณสามารถให้ชื่อเสียงแก่ฉันได้ด้วยการคลิกลูกศรขึ้นสีส้มทางด้านซ้ายของคำตอบ ขอขอบคุณและขอให้โชคดีกับการทำงานของคุณ!!! เมาริซิโอ - person Lisa Anne; 05.03.2013