2

ユーザーがSDカードから音楽ファイルを選択できるアプリがあります。私が使用しているチューザーインテントを起動するには

    Intent intent = new Intent();
    intent.setType("audio/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(
            Intent.createChooser(intent, "Complete action using"), 0);

しかし、ユーザーが選択した方法に応じて、異なる絶対パスを取得しています。ユーザーがESファイルエクスプローラーを使用している場合は取得します/sdcard/Music/song.mp3が、ユーザーが音楽アプリを使用している場合は取得し/storage/sdcard0/Music/song.mp3ます。その非常に紛らわしいと私のアプリは私が1つの最終的なベースパスを知っている必要があります。 Environment.getExternalStorageDirectory()を返します/storage/sdcard0/。どんな助けでもいただければ幸いです。
注:どちらの場合も

    Uri uri = Uri.parse(new File(soundPath).getAbsolutePath()); 
    mPlayer = MediaPlayer.create(this, uri); 

正常に動作します。

4

2 に答える 2

1

/sdcard通常、ファイルシステム(1つ)のreal(*)パスにシンボリックリンク/storageされ、デフォルトであった初期のAndroidデバイスとの互換性を維持し/sdcardます。

使用Environment.getExternalStorageDirectory()することはあなたが使用すべき方法です。そのパスをハードコーディングした場合、/sdcardまたはが機能するという保証はありません。/storage/sdcard0デバイスメーカーは、必要なほとんどすべてのファイルシステムレイアウトを使用できますEnvironmentが、正しいパスを認識していることを確認します。


(*)Honeycombと「統合ストレージモデル」を開始すると、実際のパスは、実際には、アクセス許可に必要な正しいアクセス許可を適用するために、ヒューズ/data/mediaを介してループマウントされるようなものになります。/storage/sdcard0EnvironmentWRITE_EXTERNAL_STORAGE

AndroidエンジニアのDanMorrillとの即席のQ&Aセッションは、GalaxyNexusのUSBマスストレージの欠如の背後にある軽い理由をもたらします-2番目の質問にはいくつかの詳細があります。


getAbsolutePath()ちなみに、デスクトップJavaアプリの場合と同じようには機能しません。Androidでは、現在の作業ディレクトリ/ルートは常に/です。したがってgetAbsolutePath()、常に同じように返さgetPath()れ、多くてもパスの前に。が付きます/

UriからFileは、を介して簡単に構築できます

Uri uri = Uri.fromFile(new File(soundPath));

そうすれば、あなたが使用する場合はそうではない(そしてエラーにつながる可能性がある)スキームをUri使用して正しいものを得ることができますfile://Uri.parse("/some/path")

于 2012-11-19T15:39:46.220 に答える
1

フルパスとファイル名の取得:

 Private String getPath(Uri u) {
            String[] projection = { MediaStore.Audio.Media.DATA };
            Cursor cursor = managedQuery(u, projection, null, null, null);
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }

onActivityResultでこれを使用します

文字列mpath=getPath(data.getData());

于 2013-07-26T14:33:46.903 に答える