2016-06-24 25 views
1

私は、アプリケーションのインストールまたは削除時にデバイス上で使用可能な記憶領域を確認するために次のコードを使用しています。モニタには正しい領域が印刷されません。このコードは、アプリケーションがいつ削除されるかインストールされているかをリスンするブロードキャストレシーバーで実行されます。私はここにこのコードをテストした デバイスの記憶領域が正しく動作していないと判断しました:android

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); 
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getAvailableBlocks(); 
long megAvailable = bytesAvailable/1048576; 
System.out.println("Megs Available :"+megAvailable); 

は、私が得た結果である:

私は12437メガバイト(これは変更されるだけの数があることから、ちょうど37メガバイトをしましょう)で開始しました。

私は12メガバイトだったAPPを追加しました

可能な37メガバイトは(減少している必要があります)利用できる41メガバイトまで行ってきました... 1メガバイトだったAPPを追加しました...利用できる41メガバイトは15メガバイトまで行ってきました利用できる私は、1メガバイトたアプリを削除した

(多分この1つは正常に働いていた)私が利用できる15メガバイトは14メガバイトまで行ってきました...約1 MBでしたAPPを追加しました

(あまり減少)... 14MB可14MB利用可

削除済み2メガバイトだったアプリが... 14メガバイトは、私は1メガバイトたアプリを削除した14メガバイト

に宿泊しました...利用できる14メガバイトは、利用可能な19メガバイトまで行ってきました、私は12メガバイト.. 19メガバイトが利用可能であったアプリを削除した

19MBにとどまった...

このテストを行った後、私は削除またはインストールとアプリとの間に5秒の遅延を追加してみました。デバイスの記憶域を取得しても数字はまだ間違っていました。

これに加えて、私のプログラムに応じた私の利用可能なスペースの合計は常に約12.4 GBで、私の電話設定では私には12.1 GBがあると書かれています。

より正確な数値を取得する方法はありますか?またはこの方法は信頼性があまり高くありませんか?または電話のキャッシュデータが数字を信頼できないものにしていますか?

答えて

1

Android API 9以上で使用しているコードは廃止予定です。使用可能なストレージスペースを計算する方法があります:

使用getExternalFilesDirs方法(https://developer.android.com/reference/android/support/v4/content/ContextCompat.html#getExternalFilesDirs(android.content.Context、java.lang.Stringで))外部ストレージディレクトリへのパスを取得するには:

File[] externalStoragesPaths = ContextCompat.getExternalFilesDirs(getActivity(), null); 

このメソッドはContextCompatクラスのメンバーであります(https://developer.android.com/reference/android/support/v4/content/ContextCompat.html)、これはAPI 4以降のすべてのContextクラスの機能に互換性を提供します。

if(externalStoragesPaths != null) { 
    File externalStoragePath = externalStoragesPaths[0]; 
} 

次に、あなたが使用可能なストレージ容量を決定することができます: 最初のパスは、アプリケーションが、それが所有している永続的なファイルを置くことができ、外部記憶装置の絶対パスになりますgetExternalFilesDirsから返さ

API 9 - API 17 :

long availableSpace = externalStoragePath.getFreeSpace(); // available space in bytes 

API 18以上:

long availableSpace = new StatFs(externalStoragePath.getPath()).getAvailableBytes(); 

また、getAvailableBlocks()およびgetBlockSize()の代わりにgetUsableSpace()メソッド(https://developer.android.com/reference/java/io/File.html#getUsableSpace%28%29)またはgetAvailableBlocksLong()およびgetBlockSizeLong()メソッドを使用することもできます。

+0

API 9-17では「externalStoragesPaths.getFreeSpace()」を、API 18以降では「externalStoragesPaths.getPath()」を実行しましたか?それとも、「ファイル」を使うつもりなのですか? – Natalie

+0

私の編集された答えをチェックしてください、今私はそれをより正確かつ明確にしました。 – floyd

+0

このメソッドは、私の質問に投稿したメソッドと同じ結果を与えています...たぶん、1つのアプリケーションがダウンロードまたは削除されるたびに正確なMBストレージ値を取得することはできません。 – Natalie

関連する問題