20

新しい Android デバイスのほとんどには、内部 SD カードと外部 SD カードがあります。ファイル エクスプローラー アプリを作成したいのですが、アプリで使用するパスを取得する方法がわかりません。

File file = Environment.getExternalStorageDirectory();

ほとんどのデバイスに戻るだけですが/mnt/sdcard 、のような他の外部SDカード用の別のパスがあります/storage1 or /storage2 。どんな助けでも感謝します。

4

9 に答える 9

12

Androidで内部および外部SDカードパスを取得する方法

内部ストレージに保存する方法:

File getDir (String name, int mode)

File getFilesDir () 

上記のメソッドはContextクラスに存在します

電話の内部メモリに保存する方法:

File getExternalStorageDirectory ()

File getExternalFilesDir (String type)

File getExternalStoragePublicDirectory (String type)

最初は、誰もが電話の内部メモリのルートEnvironment.getExternalStorageDirectory()を指す を使用していました。その結果、ルート ディレクトリはランダムなコンテンツでいっぱいになりました。

その後、次の 2 つのメソッドが追加されました。

Contextクラスでは、電話の内部メモリにあるアプリ固有のディレクトリを指す を追加しgetExternalFilesDir()ました。このディレクトリとその内容は、アプリをアンインストールすると削除されます。

Environment.getExternalStoragePublicDirectory()写真や動画など、よく知られているファイル タイプを一元的に保存するための場所です。アプリをアンインストールしても、このディレクトリとその内容は削除されません。

リムーバブル ストレージ (マイクロ SD カード) に保存する方法

API レベル 19 より前では、SD カードに保存する公式の方法はありませんでした。しかし、多くの人は非公式の API を使用してそれを行うことができます。

正式には、 API レベル 19 (Android バージョン 4.4 - Kitkat)のContextクラスに1 つのメソッドが導入されました。

File[] getExternalFilesDirs (String type)

アプリケーションが所有する永続ファイルを配置できるすべての共有/外部ストレージ デバイス上のアプリケーション固有のディレクトリへの絶対パスを返します。これらのファイルはアプリケーションの内部にあり、通常はメディアとしてユーザーに表示されません。

つまり、Micro SD カードと内部メモリの両方へのパスが返されます。通常、2 番目に返されるパスは、マイクロ SD カードのストレージ パスです。

Google/Android の公式ドキュメントによると、内部および外部ストレージの用語は、私たちが考えているものとはかなり異なります。

于 2016-08-04T06:34:13.847 に答える
2

はい。異なるメーカーは、Samsung Tab 3 の extsd のように異なる SDcard 名を使用し、他の samsung デバイスは、この異なるメーカーが異なる名前を使用するように sdcard を使用します。

私はあなたと同じ要件を持っていました。だから私は私のプロジェクトからあなたのためのサンプル例を作成しましたこのリンクに移動し、androi-dirchooser ライブラリを使用するAndroid ディレクトリ チューザーの例を参照してください。この例では、SD カードを検出し、すべてのサブフォルダーを一覧表示します。また、デバイスに複数の SD カードがあるかどうかも検出します。

コードの一部は次のようになります。完全な例については、リンクAndroid Directory Chooserにアクセスしてください。

/**
* Returns the path to internal storage ex:- /storage/emulated/0
 *
* @return
 */
private String getInternalDirectoryPath() {
return Environment.getExternalStorageDirectory().getAbsolutePath();
 }

/**
 * Returns the SDcard storage path for samsung ex:- /storage/extSdCard
 *
 * @return
 */
    private String getSDcardDirectoryPath() {
    return System.getenv("SECONDARY_STORAGE");
}


 mSdcardLayout.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        String sdCardPath;
        /***
         * Null check because user may click on already selected buton before selecting the folder
         * And mSelectedDir may contain some wrong path like when user confirm dialog and swith back again
         */

        if (mSelectedDir != null && !mSelectedDir.getAbsolutePath().contains(System.getenv("SECONDARY_STORAGE"))) {
            mCurrentInternalPath = mSelectedDir.getAbsolutePath();
        } else {
            mCurrentInternalPath = getInternalDirectoryPath();
        }
        if (mCurrentSDcardPath != null) {
            sdCardPath = mCurrentSDcardPath;
        } else {
            sdCardPath = getSDcardDirectoryPath();
        }
        //When there is only one SDcard
        if (sdCardPath != null) {
            if (!sdCardPath.contains(":")) {
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File(sdCardPath);
                changeDirectory(dir);
            } else if (sdCardPath.contains(":")) {
                //Multiple Sdcards show root folder and remove the Internal storage from that.
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File("/storage");
                changeDirectory(dir);
            }
        } else {
            //In some unknown scenario at least we can list the root folder
            updateButtonColor(STORAGE_EXTERNAL);
            File dir = new File("/storage");
            changeDirectory(dir);
        }


    }
});
于 2014-09-06T07:29:09.640 に答える
1

これがどれほど一般的な答えかはわかりませんが、Android 4.4 を搭載した Motorola XT830C と Nexus 7 android 6.0.1 でテストしました。および Samsung SM-T530NU Android 5.0.2 で。と を使用System.getenv("SECONDARY_STORAGE")Environment.getExternalStorageDirectory().getAbsolutePath()ました。
2 番目の SD カードがない NexusSystem.getenvは null を返し、Envirnoment.getExterna.../storage/emulated/0 を返します。
外部 SD カードを搭載した Motorola デバイスでは、/storage/sdcard1 が指定されSystem.getenv("SECONDARY_STORAGE")、 /storage/emulated Envirnoment.getExterna.../0 が指定されます。
samsumg は、外部 SD の /storage/extSdCard を返します。
私の場合、外部の場所にサブディレクトリを作成して使用しています

 appDirectory = (System.getenv("SECONDARY_STORAGE") == null)
       ? Environment.getExternalStorageDirectory().getAbsolutePath()
       : System.getenv("SECONDARY_STORAGE");

SDカードを見つける。このディレクトリにサブディレクトリを作成しています。
もちろん、外部メモリにアクセスするには、マニフェスト ファイルにアクセス許可を設定する必要がありました。
Nook 8 インチ カラー タブレットも持っています。テストする機会があれば、このアプローチに問題があれば投稿します。

于 2016-06-19T06:21:33.113 に答える
0

しかし、/storage1 や /storage2 のような他の外部 SD カード用の別のパスがあります。

Android SDK には、少なくとも Android 4.1 までは、これらのパスにアクセスできるものは何もありません。とにかく、それらはあなたのアプリで読み書きできないかもしれません。このような保存場所の動作とその使用目的は、デバイスの製造元によって異なります。

于 2012-11-13T13:04:28.437 に答える
-1

内部/外部 SD カード パスを取得するための公開 API はありません。

しかし、android.os.storage パッケージには StorageManager というプラットフォーム API があります。http://goo.gl/QJj1euを参照してください。

ストレージの一覧表示、ストレージのマウント/アンマウント、マウント状態の取得、ストレージ パスの取得などの機能があります。

しかし、これは非表示の API であり、次の Android リリースで非推奨または壊れるはずです。

また、一部のメソッドには特別な許可が必要であり、ほとんどは文書化されていません。

于 2014-07-08T00:47:53.803 に答える