2017-05-21 4 views
0

Ich habe versucht iTextpdf heute Ang in einige schäbige Fehler geraten. vor allem: java.io.FileNotFoundException: /storage/emulated/0/Download/pdfdemo20170521_145348.pdf: open failed: EACCES (Permission denied)java.io.FileNotFoundException auf Itextpdf Library tutorial

Ich habe bereits die richtigen Berechtigungen wie

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

umgesetzt, aber es funktioniert auch nicht. Hier ist der Code für meine Dateiverarbeitung:

public class SelfNoteFragment extends Fragment { 
private View mRootView; 
private EditText mSubjectEditText, mBodyEditText; 
private Button mSaveButton; 

public SelfNoteFragment() { 
    // Required empty public constructor 
} 

public static SelfNoteFragment newInstance(){ 
    SelfNoteFragment fragment = new SelfNoteFragment(); 
    return fragment; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    mRootView = inflater.inflate(R.layout.fragment_self_note, container, false); 
    mSubjectEditText = (EditText) mRootView.findViewById(R.id.edit_text_subject); 
    mBodyEditText = (EditText) mRootView.findViewById(R.id.edit_text_body); 
    mSaveButton = (Button) mRootView.findViewById(R.id.button_save); 

    mSaveButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mSubjectEditText.getText().toString().isEmpty()){ 
       mSubjectEditText.setError("Subject is empty"); 
       mSubjectEditText.requestFocus(); 
       return; 
      } 

      if (mBodyEditText.getText().toString().isEmpty()){ 
       mBodyEditText.setError("Body is empty"); 
       mBodyEditText.requestFocus(); 
       return; 
      } 

      try { 
       createPdf(); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
       Toast.makeText(getActivity(), "FILE", Toast.LENGTH_SHORT).show(); 
      } catch (DocumentException e) { 
       e.printStackTrace(); 
       Toast.makeText(getActivity(), "Document", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    return mRootView; 
} 


private void createPdf() throws FileNotFoundException, DocumentException { 

    File pdfFolder = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_DOWNLOADS), "pdfdemo"); 
    if (!pdfFolder.exists()) { 
     pdfFolder.mkdir(); 
     Log.i("TAG", "Pdf Directory created"); 
    } 

    //Create time stamp 
    Date date = new Date() ; 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(date); 

    //Filename 
    File myFile = new File(pdfFolder + timeStamp + ".pdf"); 

    OutputStream output = new FileOutputStream(myFile); 

    //Designate the size 
    Rectangle pagesize = new Rectangle(216f, 720f); 
    Document document = new Document(pagesize, 36f, 72f, 108f, 180f); 

    PdfWriter.getInstance(document, output); 

    //OPEN ITEXT FOR DOCUMENT SCANNING 
    document.open(); 

    document.add(new Paragraph(mSubjectEditText.getText().toString())); 
    document.add(new Paragraph(mBodyEditText.getText().toString())); 

    //If scanning is done, Close the document 
    document.close(); 

} 

Wenn ich mein Logcat ansehe, erscheint ein Fehler in der Zeile 107. Das ist die Zeile: OutputStream output = new FileOutputStream(myFile);

+0

Wenn auf Android sechs und über Berechtigungen in einem offenkundigen anfordernden ist nicht genug. Sie sollten Code hinzufügen, damit der Benutzer diese Berechtigungen ebenfalls erteilt. Laufzeitberechtigungen – greenapps

+0

'pdfFolder.mkdir(); Log.i ("TAG", "Pdf-Verzeichnis erstellt"); '. Irreführendes Protokoll und unwahr. Überprüfen Sie den Rückgabewert von mkdir. Und handle entsprechend. Ihr Verzeichnis wurde nicht erstellt. Und du weißt es nicht. Und du gehst weiter als ob es da wäre. – greenapps

+0

Wie fordere ich sie auf, nach Berechtigungen zu fragen? Alles, was ich tat, war Manifest. – JJCADIZ

Antwort

1

Für sdk> = 23 müssen Sie Runtime permission fragen.

Hier ist eine list Runtime-Berechtigung in Android Os erforderlich. mit

in Ihrem Oncreate()

um Erlaubnis fragen:

if (Build.VERSION.SDK_INT >= 23) { 
    if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      == PackageManager.PERMISSION_GRANTED) { 
     //you code.. 
     //read_file() 
    } else { 
     //request permission 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); 
    } 
} 
else { 

    //permission is automatically granted on sdk<23 upon installation 
    //Your code 
    //read_file() 
} 

Fang der Erlaubnis Ergebnis in:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 

     case 0: { 

      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show(); 
       //read_file() 
      } else { 
       Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show(); 
      } 
      return; 
     } 
    } 
} 
Verwandte Themen