3

EDIT2:Googleからこの質問に出くわした人々のために。このcanWrite()機能はちょっとバグがあり、正しく動作していないようです。使用しないことをお勧めします。代わりにただcatch例外。またUSB Storage、SD カードに書き込むことができるように、携帯電話がモードになっていないことを確認してください。最後に、Android デバイスの設定で書き込み禁止などの設定が行われていないことを確認してください。

Android フォンで SD カードに書き込もうとすると問題が発生するようです。Eclipse を使用してデバッグ モードを使用しているか、電話を単独で実行しているかは問題ではありません。SDカードに書き込めません。はい、以下に示すように、アクセス許可が構成されています。Android サイトで提供されているコード スニペットを使用すると、セグメントの終了後に両方のブール値に false が与えられます。ストレージが利用できない、または書き込み可能でない理由がまったくわかりません。SDカードと電話をMacから取り出して、それらが使用されていないこと、および電話がマウントできることを確認しますが、前述のように、Eclipseをまったく使用していない場合でも同じ問題が発生します。

編集: about 情報に従って、4.04 を実行している実際の Android 携帯を使用します。

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tinywebteam.gpstracker"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.tinywebteam.gpstracker.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

以下を実行しようとすると失敗しmkdirs()、割り当てられた例外がスローされます。

try {
            File sdCard = Environment.getExternalStorageDirectory();
            File dir = new File(sdCard.getAbsolutePath() + "/GPStracker/data/");
            if (!dir.exists()) {
                if (!dir.mkdirs())
                    throw new FileNotFoundException("Couldn't make directory.");
            }
            File fileOut = new File(dir, "GPSTracker_" + ts + ".csv");
            if (fileOut.canWrite()) {
                FileOutputStream out = new FileOutputStream(fileOut);
                out.write(fileStr.getBytes());
                out.close();
                System.out.println("File written successfully");
            } else {
                System.out.println("Could not write to file");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
4

3 に答える 3

2

ドキュメントによると、あなたが説明している状態は、外部メディア ストレージにアクセスできないことを意味します。

public static final 文字列 MEDIA_SHARED

API レベル 1 で追加された getExternalStorageState() は、メディアがマウントされていない場合に MEDIA_SHARED を返し、USB 大容量ストレージを介して共有されます。

定数値: 「共有」

USB 大容量ストレージ オプションに移動し、USB ストレージをオフにする必要があります。

于 2013-04-04T19:48:07.723 に答える
0

私は samsung galaxy s3 (Android 4.1.2 を実行) を持っており、内部メモリの名前は sdCard0 で、外部 SD カードの名前は 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);
}

実際のパスを取得したら、ファイルを SD カードに書き込むことができます。

于 2013-04-04T20:05:05.107 に答える
0

これが取引です、あなたが使用しています

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/GPStracker/data/");

代わりに -

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdcard + "/GPStracker/data");

ここでは、2 番目の「/」を使用しませんでしたmkdirs()。これは、再帰的なディレクトリを作成していると誤解するためです。この例外は発生しません。また、ファイル名の前に「/」を追加して渡すか、この方法でも機能するかどうかを確認してください。

于 2013-04-04T20:03:32.400 に答える