2016-11-08 7 views
2

こんにちは、Android Nougatでダウンロードしたapkを開くのが大変です。私はファイルプロバイダが私がちょうど正しいパスを入力する方法を把握できないことによって使用される必要があることを知っています。アプリがクラッシュするか、ファイルが見つかりません。それは常に/storage/emulated/0/Android/data/cf.vojtechh.apkmirror/Downloadsを開きます - もちろんどちらが存在しません。私は内部ストレージAndroid Nougatでダウンロードしたファイルをファイルプロバイダで開きます。

任意のアイデア(Environment.getExternalStorageDirectory()。ある、getPath()+ "/" + Environment.DIRECTORY_DOWNLOADS + "/" + fileNameにのようなもの)でのダウンロードディレクトリをアクセスもするアプリが必要?私はこれをインターネット上で1時間以上探していましたが、私はそれを見つけることができませんでした(私は怒っていましたので、私はそこでクラッシュして無視したいと思っていました)

MainActivity.java

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
         File apkfile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), fileName); 
         Uri apkUri = FileProvider.getUriForFile(MainActivity.this, "cf.vojtechh.apkmirror.provider", apkfile); 
         String s = apkUri.toString(); 
         Log.d("HERE!!",s); 
         Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); 
         intent.setData(apkUri); 
         intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
         startActivity(intent); 

} else { 
         File apkfile = new File(Environment.getExternalStorageDirectory().getPath() + "/" + Environment.DIRECTORY_DOWNLOADS + "/" + fileName); 
         Uri apkUri = Uri.fromFile(apkfile); 
         Intent intent = new Intent(Intent.ACTION_VIEW); 
         intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); 
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(intent); 
} 

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?> 
    <paths> 
     <external-path name="Download" path="Download/"/> 
    </paths> 

AndroidManifest.xmlを

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="cf.vojtechh.apkmirror.provider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/provider_paths"/> 
    </provider> 

答えて

2

代わりにEnvironment#getExternalStoragePublicDirectory()メソッドを使用してみてください。 Context#getExternalFilesDir()はアプリ専用のファイルに使用されるため、アプリのパッケージ名を含むパス(技術的にはこのディレクトリですが、あなたの探しているものではありません)。

File apk = new File(downloads, filename); 
File downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

は次に、ダウンロードしたファイルの File表現を作成することができます
関連する問題