2013-03-05 6 views
1

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

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

+0

getFilesDir() - это путь для вас, пожалуйста, отправьте сообщение logcat, когда он сработает. –

ответ

1

Ну, если вы хотите сэкономить на внутренней памяти вы должны не использовать Environment.getExternalStorageDirectory(), но вы должен использовать getFilesDir() (возвращает файл, представляющий внутреннюю директорию для вашего приложения).

См. official Android docs on the subject, они совершенно ясны.

+0

Если вы посмотрите на мой код выше, вы увидите, что я использовал getFilesDir(), но это приводит к сбою моего приложения. – DMC

+0

@ cv82 Я вижу, пожалуйста, разместите свой LogCat, посмотрим, где находится prtoblem –

+0

Я добавил свой логарифм выше – DMC

Смежные вопросы