9

多くのメディア ファイルを保存する Android アプリを作成しています。それらは、ユーザー通知やその他のメディア ディレクトリを乱雑にするタイプではありません (そして多すぎます) が、ユーザーが更新できる必要があるため、リソースに含めることはできません。getExternalFilesDir を使用して SD カードのパスを取得できますが、アプリ自体が SD カードにインストールされている場合にのみ実行したいと考えています。アプリが内部にインストールされている場合は、メディアを内部メモリに入れたいです。

では、アプリが内部メモリと外部メモリのどちらで実行されているかを判断するにはどうすればよいでしょうか?

4

3 に答える 3

9

PackageManager を使用して ApplicationInfo を取得し、そこからFLAG_EXTERNAL_STORAGEの「フラグ」を確認できます。

これは私がデモンストレーションのために作った簡単な例です:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    PackageManager pm = getPackageManager();
    try {
       PackageInfo pi = pm.getPackageInfo("com.totsp.helloworld", 0);
       ApplicationInfo ai = pi.applicationInfo;
       // this only works on API level 8 and higher (check that first)
       Toast
                .makeText(
                         this,
                         "Value of FLAG_EXTERNAL_STORAGE:"
                                  + ((ai.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == ApplicationInfo.FLAG_EXTERNAL_STORAGE),
                         Toast.LENGTH_LONG).show();
    } catch (NameNotFoundException e) {
       // do something
    }
}

それでも、状況に応じて (すべての「メディア」を前もって持っているかどうか、またはユーザーがアプリを使用するときに取得/作成するかどうか)、関係なく外部ストレージに配置することをお勧めします。大きなサイズの内部アプリは、多くのユーザーから嫌われています (そして、多くの内部メディアはおそらく巨大化するでしょう)。

于 2010-10-23T17:26:43.320 に答える
3

アプリがSDカードにインストールされているかどうかを確認するためのコードは次のとおりです。

  /**
   * Checks if the application is installed on the SD card.
   * 
   * @return <code>true</code> if the application is installed on the sd card
   */
  public static boolean isInstalledOnSdCard() {

    Context context = MbridgeApp.getContext();
    // check for API level 8 and higher
    if (VERSION.SDK_INT > android.os.Build.VERSION_CODES.ECLAIR_MR1) {
      PackageManager pm = context.getPackageManager();
      try {
        PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
        ApplicationInfo ai = pi.applicationInfo;
        return (ai.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == ApplicationInfo.FLAG_EXTERNAL_STORAGE;
      } catch (NameNotFoundException e) {
        // ignore
      }
    }

    // check for API level 7 - check files dir
    try {
      String filesDir = context.getFilesDir().getAbsolutePath();
      if (filesDir.startsWith("/data/")) {
        return false;
      } else if (filesDir.contains("/mnt/") || filesDir.contains("/sdcard/")) {
        return true;
      }
    } catch (Throwable e) {
      // ignore
    }

    return false;
  }
于 2011-06-21T13:20:35.353 に答える
0

アプリケーションが SD カードにインストールされているかどうかを確認するには、次のようにします。

ApplicationInfo io = context.getApplicationInfo();

if(io.sourceDir.startsWith("/data/")) {

//application is installed in internal memory

} else if(io.sourceDir.startsWith("/mnt/") || io.sourceDir.startsWith("/sdcard/")) {

//application is installed in sdcard(external memory)

}
于 2013-03-29T06:00:46.713 に答える