2012-10-31 14 views
15

Jestem nowy na Androida, i mam problem, gdy próbuję zapisać plik w pamięci wewnętrznej, nowy przykład działa na moim SDK, ale nie działa na mój telefon.zapisywanie pliku w pamięci wewnętrznej Android

Próbuję uruchomić de przykład w Xperia Sony Ericsson z Android 2.1 przy okazji ... The log.i - daje mi kolejną linię:

/data/data/com.example.key/files/text/(my_title) 

Dzięki.

@Override 
     protected void onCreate(Bundle savedInstanceState) { 
      // TODO Auto-generated method stub 
      super.onCreate(savedInstanceState); 

      setContentView(R.layout.new_text); 

      file = (EditText) findViewById(R.id.title_new); 
      entry = (EditText) findViewById(R.id.entry_new); 

      btn = (Button) findViewById(R.id.save_new); 
      btn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        File myDir = getFilesDir(); 


        NEWFILENAME = file.getText().toString(); 
        if (NEWFILENAME.contentEquals("")){ 
         NEWFILENAME = "UNTITLED"; 
        } 
        NEWENTRY = entry.getText().toString(); 

        try { 

         File file_new = new File(myDir+"/text/", NEWFILENAME); 
         file_new.createNewFile(); 

         Log.i("file", file_new.toString()); 

         if (file_new.mkdirs()) { 
          FileOutputStream fos = new FileOutputStream(file_new); 

          fos.write(NEWENTRY.getBytes()); 
          fos.flush(); 
          fos.close(); 
         } 

        } catch (FileNotFoundException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 

        Intent textPass = new Intent("com.example.TEXTMENU"); 
        startActivity(textPass); 
       } 
      }); 

      } 


//That's for creating... then in other activity i'm reading 

      @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      // TODO Auto-generated method stub 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.text_menu); 

      btn = (Button) findViewById(R.id.newNote); 
      listfinal = (ListView) findViewById(R.id.listView); 

      btn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Intent textPass = new Intent("com.example.TEXTNEW"); 
        startActivity(textPass); 

       } 
      }); 

      listfinal.setOnItemClickListener(this); 

      File fileWithinMyDir = getApplicationContext().getFilesDir(); 


      loadbtn = (Button) findViewById(R.id.loadList); 

      loadbtn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        File myDir = getFilesDir(); 

        File dir = new File(myDir + "/text/"); 

        String[] files = dir.list(); 

        //String[] files = getApplicationContext().fileList(); 
        List<String> list = new ArrayList<String>(); 

        for (int i =0; i < files.length; i++){ 
         list.add(files[i]); 
        } 
        ArrayAdapter<String> ad = new ArrayAdapter<String>(TextMenu.this, android.R.layout.simple_list_item_1, 
            android.R.id.text1, list); 

        listfinal.setAdapter(ad); 
       } 
      }); 
      } 

w moim android manifiest mam uprawnienia

   <uses-sdk 
        android:minSdkVersion="5" 
        android:targetSdkVersion="15" /> 

       <uses-permission android:name="android.hardware.camera" /> 
       <uses-permission android:name="android.permission.INTERNET" /> 
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
       <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 
+0

Czy możesz podać LogCat? – 323go

+1

Spróbuj utworzyć katalog, w którym chcesz najpierw umieścić swój plik za pomocą 'File.mkdirs()' zadzwoń pod numer – vasart

Odpowiedz

27

Nie jestem zbyt pewien przykład, który masz na myśli, ale mam dwie próbki pracy tutaj, z których co najmniej jeden z nich powinien odpowiadać Twoje potrzeby. I badane są na X10 kolejny numer budowy 2.1.A.0.435, jeden Xperia T numer kompilacją 7.0.A.1.303 jeden Nexus Liczba s kompilacją JZO54K

przykładu 1

String filename = "myfile"; 
    String outputString = "Hello world!"; 

    try { 
     FileOutputStream outputStream = openFileOutput(filename, Context.MODE_PRIVATE); 
     outputStream.write(outputString.getBytes()); 
     outputStream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try { 
     FileInputStream inputStream = openFileInput(filename); 
     BufferedReader r = new BufferedReader(new InputStreamReader(inputStream)); 
     StringBuilder total = new StringBuilder(); 
     String line; 
     while ((line = r.readLine()) != null) { 
      total.append(line); 
     } 
     r.close(); 
     inputStream.close(); 
     Log.d("File", "File contents: " + total); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Przykład 2

String filename = "mysecondfile"; 
    String outputString = "Hello world!"; 
    File myDir = getFilesDir(); 

    try { 
     File secondFile = new File(myDir + "/text/", filename); 
     if (secondFile.getParentFile().mkdirs()) { 
      secondFile.createNewFile(); 
      FileOutputStream fos = new FileOutputStream(secondFile); 

      fos.write(outputString.getBytes()); 
      fos.flush(); 
      fos.close(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try { 
     File secondInputFile = new File(myDir + "/text/", filename); 
     InputStream secondInputStream = new BufferedInputStream(new FileInputStream(secondInputFile)); 
     BufferedReader r = new BufferedReader(new InputStreamReader(secondInputStream)); 
     StringBuilder total = new StringBuilder(); 
     String line; 
     while ((line = r.readLine()) != null) { 
      total.append(line); 
     } 
     r.close(); 
     secondInputStream.close(); 
     Log.d("File", "File contents: " + total); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

, dlaczego możesz sprawdzić "secondFile.getParentFile(). Mkdirs()' czy możesz wyjaśnić? – yashhy

+3

Jeśli nadal chcesz uzyskać odpowiedź: to wywołanie służy upewnieniu się, że ścieżka dostępu do pliku istnieje, w razie potrzeby tworzy hierarchię katalogów. – prom85

+0

Jeśli ktoś nadal będzie zainteresowany tą odpowiedzią: WHEN targetowanie API 23+, W czasie wykonywania należy zażądać uprawnienia WRITE_EXTERNAL_STORAGE. W przeciwnym razie pojawi się błąd "Odmowa uprawnień" – Zoe

1

Miałem problem "Odmowa uprawnień" z Samsung Galaxy S7, mimo że dałem uprawnienia do odczytu i zapisu w pliku manifestu. Rozwiązałem go, przechodząc do ustawień telefonu >> aplikacja >> [moja aplikacja] i dozwolone "Przechowywanie" pod pozwoleniem. Po tym wszystko poszło dobrze.

+2

** Pułapka: ** Zezwalanie na zewnętrzne przechowywanie danych musi być wymagane w środowisku wykonawczym, jeśli aplikacja kieruje na API 23 lub nowszy. WRITE_EXTERNAL_STORAGE jest niebezpiecznym zezwoleniem, co oznacza, że ​​musi zostać zażądany. – Zoe

Powiązane problemy