4

다운로드 폴더에서 파일을 열 수 없습니다.FileProvider - 다운로드 디렉토리에서 파일 열기

나는 파일을 다운로드 및이와 다운로드 폴더에 저장할 수 있습니다 :이 후

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
    request.setDescription(descricao); 
    request.setTitle(titulo); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     request.allowScanningByMediaScanner(); 
     request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
    } 
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, nome); 

    enq = downloadManager.enqueue(request); 

, 내 파일 디렉토리 폴더에 저장 올바른 : 안드로이드 >> 내부 공유 스토리지 >> 다운로드합니다. ***이 경로는 우분투에서 수동으로 장치의 hd를 여는 것을 볼 수 있습니다. 이미지에 경로가 표시됩니다. Android HD by ubuntu folder - see the path

그리고 나는이이 파일을 열어보십시오

downloadManager = (DownloadManager)getContext().getSystemService(DOWNLOAD_SERVICE); 
     BroadcastReceiver receiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action = intent.getAction(); 
       if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
        long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
        DownloadManager.Query query = new DownloadManager.Query(); 
        query.setFilterById(enq); 
        Cursor c = downloadManager.query(query); 
        if(c.moveToFirst()) { 
         int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS); 
         if(DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { 
          String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 

          if (uriString.substring(0, 7).matches("file://")) { 
           uriString = uriString.substring(7); 
          } 

          File file = new File(uriString); 

          Uri uriFile = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID + ".fileprovider", file); 
          String mimetype = "application/pdf"; 
          Intent myIntent = new Intent(Intent.ACTION_VIEW); 
          myIntent.setDataAndType(uriFile, mimetype); 

          Intent intentChooser = Intent.createChooser(myIntent, "Choose Pdf Application"); 
          startActivity(intentChooser); 
         } 
        } 
       } 
      } 
     }; 

     getContext().registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 

나는이 함께 매니페스트에 내 파일 제공자를 선언을 :

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="${applicationId}.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/provider_paths"/> 
    </provider> 

이와 :

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="Download" path="Download/"/> 
</paths> 

그러나 다운로드 버튼을 클릭하면 다음 메시지가 나타납니다. "이 파일 접근 할 수 없다. 위치 또는 네트워크를 확인하고 다시 시도하십시오 "

다시 시작 :

- 1의 파일을 다운로드하고 저장 한 디렉토리 폴더에

2

입니다 - 의도가 시작되지만 파일이 없습니다.. openned

3 - 디버그 모드가 "새로운 파일 (URLString는)"날이 제공 :. - FileProvider.getUriFromFile "에서

4"URLString는 =/저장// 0/다운로드/name.pdf을 에뮬레이트 ". .. "디버그 모드는 다음과 같습니다.

"uriFile = 내용 : //com.example.android.parlamentaresapp.fileprovider/Download/name.pdf"

감사합니다.

+0

'Android >> Internal Shared Storage >> Download.'. 이는 코드에서 사용할 수있는 파일 시스템 경로가 아닙니다. 실제 전체 경로를 입력하십시오. – greenapps

답변

6

당신이 startActivity()FileProviderUri와 함께 사용하는 Intent에 전화 addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION). 이것이 없으면 활동에 콘텐츠에 액세스 할 권한이 없습니다.

+0

대단히 고마워요. 내 문제를 해결! – Sarara

+0

고맙습니다. 누락 된 깃발이 문제였습니다! –

+0

고마워, 그것은 나를 위해 작동하지만 수신 app (Amaze Text Editor)는'sh : [7] : cat : /Download/error.txt : No such file or directory'을 보여 줍니 다. –