2

ファイルが存在するかどうかを簡単に確認しようとしています。ここで同様の質問を見ましたが、役に立ちませんでした。アプリケーションを実行すると、アプリケーションがクラッシュし、「残念ながら、fileCheck1 が停止しました」というメッセージが表示されました。エミュレータとスマートフォンの両方でこのエラーが発生しました。

私のコード:

package com.example.fileCheck1;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;

import java.io.File;

public class MyActivity extends Activity {

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

        msgText = (TextView) findViewById(R.id.textView);
        String Path = Environment.getExternalStorageDirectory().getPath()+"/ping.xml";
        File file = getBaseContext().getFileStreamPath(Path);
        if(file.exists()){
            msgText.setText("Found");
        }
        if(!file.exists()){
            msgText.setText("Not Found");
        }
    }
}

私のマニフェストでは、そのような権限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

前もって感謝します。

4

3 に答える 3

3

その問題はここにあると思います:

getBaseContext()

に割り当てられている場所NULL。この行は本当に必要ありません。あなたは単にあなたの目標を達成することができます

String path = Environment.getExternalStorageDirectory().getPath() + "/ping.xml";
File f = new File(path);
if (f.exists()) {
   // do your stuff
}
else {
  // do your stuff
}

アップデート:

あなたまたは他の誰かが Samsung Galaxy S3 を持っている場合は、@Raghunandan の回答に従ってください。この場合、getExternalStorageDirectory()内部メモリが返されるためです。

于 2013-04-01T13:13:37.450 に答える
3

Android 4.1.2を搭載したsamsung galaxy s3があります。内部電話メモリの名前は sdcard0 で、外部カードの名前は extSdCard です。

Environment.getExternalStorageDirectory()

したがって、上記は内部電話メモリである sdcard0 のパスを返します

したがって、以下を使用できる実際のパスを取得します

String externalpath = new String();
String internalpath = new String();

public  void getExternalMounts() {
Runtime runtime = Runtime.getRuntime();
try
{
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;

BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
    if (line.contains("secure")) continue;
    if (line.contains("asec")) continue;

    if (line.contains("fat")) {//external card
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            externalpath = externalpath.concat("*" + columns[1] + "\n");
        }
} 
        else if (line.contains("fuse")) {//internal storage
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            internalpath = internalpath.concat(columns[1] + "\n");
        }
    }
}
}
catch(Exception e)
{
    e.printStackTrace();
}
  System.out.println("Path  of sd card external............"+externalpath);
  System.out.println("Path  of internal memory............"+internalpath);
}

パスを取得したら

    File file = new File(internalpath+"/ping.xml");// internalpath or external path
    if(file.exists()){
        msgText.setText("Found");
    }
    else{
        msgText.setText("Not Found");
    }

アップデート :

上記の解決策はお勧めしません。うまくいかないことがあります。Environment.getExternalStorageDirectory()外部ストレージのパスを常に返します。ほとんどの場合、それは SD カードです。

ドキュメントから

public static File getExternalStorageDirectory ()

API レベル 1 で追加 プライマリ外部ストレージ ディレクトリを返します。このディレクトリは、ユーザーがコンピュータにマウントした場合、デバイスから削除された場合、またはその他の問題が発生した場合、現在アクセスできない可能性があります。getExternalStorageState() で現在の状態を確認できます。

注: ここで「外部」という言葉を混同しないでください。このディレクトリは、メディア/共有ストレージと考えるとよいでしょう。これは、比較的大量のデータを保持できるファイル システムであり、すべてのアプリケーションで共有されます (権限を強制しません)。従来、これは SD カードですが、保護された内部ストレージとは別のデバイスに内蔵ストレージとして実装され、コンピュータにファイルシステムとしてマウントできる場合もあります。

于 2013-04-01T13:19:46.073 に答える
0

これをチェックして:

    File file = new File(Environment.getExternalStorageDirectory()+"/ping.xml");
    if(file.exists()){
        msgText.setText("Found");
    }
    else{
        msgText.setText("Not Found");
    }
于 2013-04-01T13:14:59.737 に答える