2017-05-21 4 views
0

私はiTextpdfを今日試しています。主に :java.io.FileNotFoundException: /storage/emulated/0/Download/pdfdemo20170521_145348.pdf: open failed: EACCES (Permission denied)java.io.FileNotFoundException Itextpdfライブラリチュートリアル

は、私はすでに

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

などの適切な権限を実装しているが、それはまた、動作しません。私のファイル処理のコードは次のとおりです。

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(); 

} 

私がlogcatを見ると、107行目のエラーが表示されます。 OutputStream output = new FileOutputStream(myFile);

+0

十分ではありませんアンドロイド6上とマニフェストにパーミッションを要求する上記の場合。ユーザーにこれらのアクセス許可を与えるように指示するコードを追加する必要があります。実行時アクセス許可。 – greenapps

+0

'pdfFolder.mkdir(); Log.i( "TAG"、 "Pdf Directory created"); '。誤ったログと真実。 mkdirの戻り値を確認してください。そして、対処する。あなたのディレクトリは作成されません。あなたはそれを知らない。まるでそれがそこにあるかのように続行します。 – greenapps

+0

どのように私は彼らに許可を求めるように促すのですか?私がしたことはすべてマニフェストに含まれていました。 – JJCADIZ

答えて

1

sdk> = 23の場合、Runtime permissionに質問する必要があります。

ここには、Android OSで必要な実行時アクセス許可のlistがあります。あなたのOncreate()

使用許可を求め:

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() 
} 

でキャッチ許可結果を:

@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; 
     } 
    } 
} 
関連する問題