2016-04-06 11 views
1

ファイルが存在しない場合は、特定のディレクトリにダウンロードする簡単なコードを記述します。これは、一部のデバイスで正しく動作しないではない他のいくつかの中に(私はそれはばかげているようだ知っている)私のコードです:Android:file.existsファイルをダウンロードして保存するときに常にfalseが返されるいくつかのデバイス

try { 
     File direct = new File(Environment.getExternalStorageDirectory().toString() + "/abredanesh/library"); 
     boolean result = false; 
     if(!direct.exists()) 
      result = direct.mkdirs(); 

     File myfile = new File(Environment.getExternalStorageDirectory() + "/abredanesh/library","/a.pdf"); 
     if (!myfile.getAbsoluteFile().exists()) { 

      DownloadManager mgr = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE); 

      Uri downloadUri = Uri.parse(url); 
      DownloadManager.Request request = new DownloadManager.Request(downloadUri); 

      request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI 
        | DownloadManager.Request.NETWORK_MOBILE); 
      request.setAllowedOverRoaming(false).setTitle("ابر دانش"); 
      request.setDescription("دانلود کتاب"); 
      request.setDestinationInExternalPublicDir("abredanesh/library/", "a.pdf"); 

      mgr.enqueue(request); 
     } 
    } catch (Exception e) { 
     Log.e("PARSE_ERROR", e.toString()); 
     e.printStackTrace(); 
    } 

そして、これは私の許可リストである:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 

<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" /> 
<uses-permission android:name="android.permission.ACCESS_ALL_DOWNLOADS" /> 
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" /> 

<!-- This app has permission to register and receive data message. --> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<!-- This app has permission to register and receive data message. --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="com.ghaleh.football.permission.C2D_MESSAGE" /> 

<!-- permission if the application needs to keep the processor from sleeping when a message is received. --> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

私の目標のAndroidバージョンこのコードは、アンドロイド5.1のHuaweiとアンドロイド4.4のSamsung J2でうまく動作します。 アンドロイド4.2のHTC欲望では、beacausemyfile.getAbsoluteFile()。exists()がfalseを返すたびにファイルをダウンロードします。 (myfile.exists()とmyfile.canread()のどちらか)。 はアンドロイド6とNexus 5のでは、フォルダを作成し、それをダウンロードするためのアクセス許可エラーを示しています。

サムスンとHTCの両方に外部メモリがあり、HuaweiとNexusは外部メモリを持っていません。このコードはサムスンの内部メモリにフォルダとファイルを作成し、HTCで外部ファイルを使用します!

私のコードで何が問題になっていますか?他の権限が必要ですか?なぜこれらのデバイスのどれも次のようには動作しません!私は多くのページとfile.existに関する質問を見ましたが、答えのどれも私のすべてのデバイスで動作しません。

============================================== ========

編集:@draksia私は、ファイルを開こうとしたお勧めのよう

。私は、ファイル開くには、このコードを使用します「この文書を開くことができない」

  Intent target = new Intent(Intent.ACTION_VIEW); 
     target.setDataAndType(Uri.fromFile(myfile), "application/pdf"); 
     target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 

     Intent intent = Intent.createChooser(target, "Open File"); 
     try { 
      startActivity(intent); 
     } catch (ActivityNotFoundException e) { 
      // Instruct the user to install a PDF reader here, or something 
     } 

サムスンとHuaseiがファイルを開きますが、HTCは、このエラーが発生しますが(私はHTCのPDFを開くためのいくつかのアプリを持っています)

+0

ファイルが存在するかどうかを確認するのではなく、ファイルを開くとエラーが表示されますか? – draksia

+0

'Android 6のNexus 5では、フォルダを作成してダウンロードする際に権限エラーが表示されます。Android 6では権限システムが変更されています。 –

+0

@BobMaloogaターゲットバージョンは23です。Android 6の権限システムはターゲットバージョンに関連していますか? – Taher

答えて

1

問題は解決しました。

私はHTCとサムスンの両方が外部メモリを持っていたと言いましたが、HTCはSDcardを使ってファイルを保存していました。サムスンは内部メモリを使いました。

これは私のデバイスに問題があると思われます。私はHTCのカップル時間を再起動しますが、何も起こりませんでした。その後、私はHTCからSDcardを削除しました。私は内部メモリを使ってすごくうまくいったことに衝撃を与えた!それから私はSDカードをもう一度戻しました(私はSDカードを取り出したり置いたりするために電源を切るべきです)。今は両方の記憶がありますが、内部メモリを使ってファイルを保存しています。

私はこの保管システムと本当に混同しています。

3

以下のコードを使用して、異なるバージョンのファイルパスを確認してください。

getBaseContext().getFilesDir(); 

バージョン4.0ではパスが

"/data/data/com.androidexample.splashscreen/files" です。

6.0バージョンのパスは

"/data/user/0/com.androidexample.splashscreen/files" です。

+0

です。 "/data/data/com.example.testapp.pdfreader/files/abredanesh/library/a.pdf"が返されます。これはファイルの正しい場所ではありません。 – Taher

+0

エラーログを投稿できますか? @Theher –

関連する問題