Сохранить файл во внутреннюю память в частном порядке

Я хочу сохранить файл в своем внутреннем хранилище в частном порядке, чтобы мое приложение было единственным, которое может получить к нему доступ. Согласно сайту разработчиков 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]

И на моем экране написано Ошибка: неверный путь к документу.


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, посмотрим, где проблема - 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 ты прав. Надеюсь, вы тестируете на реальном телефоне (не в эмуляторе), и на вашем телефоне установлена ​​программа для чтения PDF-файлов... - person Lisa Anne; 05.03.2013
comment
Да, я тестирую его на планшете, и у меня установлен Adobe Reader. - person DMC; 05.03.2013
comment
@ cv82 ну у меня его нет ... Пока я могу только помочь вам. В любом случае, если вы оценили мой ответ, вы могли бы повысить мою репутацию, щелкнув оранжевую стрелку вверх слева от ответа. Спасибо и удачи в работе!!! Маурицио - person Lisa Anne; 05.03.2013