2

File.canWrite() は、パーミッションが提供されているにもかかわらず、一部のデバイスで false を返します。

私のアプリケーションでは、外部 Sd カードにデータを書き込む必要があります。ただし、これは一部のデバイスでは機能しますが、他のデバイスでは失敗します。たとえば 動作: Limebox 内部フラッシュ、SDCard、Android OS: 2.3.3 Samsung Sdcard、extSdcard、Android OS: 4.0.3

失敗: Leoxys sdcard、extsd android OS:4.0.3

外部 SD カードへの書き込み操作を許可する Android 互換デバイスを動的に見つける方法。myfile.canWrite

詳細: getExternalSD() は、外部 SD カード パスを返すユーザー定義関数です。

私の場合、外部SDカードのパスは「/mnt/extSdcard」(または)「/mnt/extsd」です。ファイル「/system/etc/vold.fstab」を読み取って、外部SDカードのパスを見つけています。

ここにいくつかのコード スニペットがあります: 外部 SD カードにフォルダーを作成します。一部のデバイスでは、myfile.canWrite() が False を返し、フォルダーを作成できません。

String sdcardpath = getExternalSD();
    System.out.println("the sdcard path is:"+sdcardpath.trim().toString());
    tv = (TextView) findViewById(R.id.textView1);
    tv.append("the sd card path is:"+sdcardpath);

    File myfile = new File(sdcardpath);
    tv.append("\n the extsd is readable or not:"+myfile.canRead());
    tv.append("\n \n the extsd is writable or not:"+myfile.canWrite());
    if(myfile.canWrite()){
        File testfile = new File(sdcardpath, "test");
        if(testfile.exists()){

        }else{
            boolean mkdir = testtlie.mkdirs();
            if(mkdir == true){
            tv.append("\n\n the path is:"+sdcardpath.trim().toString()+"/myfile");
            }else{
                tv.append("\n File does not have permissions");
            }
        }

    }else{
        System.out.println("the external sd card does not have write permissions");
        tv.append("\n\n the external sd card does not have write permissions");
    }

xml ファイルのスニペット。

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

についての提案をいただきたいと思い
ます。デバイスが本当に Android と互換性があるかどうかを開発者に知らせる API はありますか?
b. 異なるハードウェア デバイスで動作に違いがある理由。これはファームウェアに関連していますか?
c. この種のハードウェアで書き込みを行う別の方法はありますか?

/system/etc/premissions/ の下にあるファイル "platform.xml" のアクセス許可をターミナル エミュレーターを使用して変更しようとしましたが、ファイルを書き込みモードで開くことができません

デフォルトでは、android は Environment.getEnternalStorageDirectory() を提供します。ただし、ライブラリは、一部のデバイスの内部メモリになる「/mnt/sdcard」を返します。

ご意見をお待ちしております!!

4

3 に答える 3

3

File.canWrite() は、パーミッションが提供されているにもかかわらず、一部のデバイスで false を返します。

それは、あなたがやろうとしていることに対する許可がないからです。

私のアプリケーションでは、データを外部 Sd カードに書き込む必要があります

Android アプリケーションは、必ずしも「外部 Sd カード」にアクセスできるとは限りません。すべてのデバイス「外部 Sd カード」があるわけではありません。したがって、あなたの「必要性」には欠陥があり、置き換える必要があります。

外部 SD カードへの書き込み操作を許可する Android 互換デバイスを動的に見つける方法。myfile.canWrite

あなたはそうしない。

私の場合、外部 Sdcard パスは「/mnt/extSdcard」(または)「/mnt/extsd」です。

これらのパスは、一部のファームウェア バージョンの一部のデバイスに存在する場合があります。「外付けSDカード」の有無は端末メーカー次第です。マウントされているかどうか、マウントされている場合はどの時点であるかは、デバイスの製造元次第です。許可が何であるかは、デバイスの製造元次第です。そして、これらの答えは、ファームウェアのアップグレードにより、いつでも、どのデバイスでも変更される可能性があります。

ファイル「/system/etc/vold.fstab」を読み取って、外部SDカードのパスを見つけています

これはランダムな推測よりも段階的に優れていますが、Android SDK の範囲をはるかに超えています。

一部のデバイスでは、myfile.canWrite() が False を返し、フォルダーを作成できません。

もちろん。

デフォルトでは、android は Environment.getEnternalStorageDirectory() を提供します。

これにより、外部ストレージへのポイントが返されます。これはFile、ユーザーがデバイスとホスト コンピューターの間に USB ケーブルを接続し、外部ストレージをドライブまたはボリュームとしてマウントした場合にアクセスできるものです。

を。デバイスが本当に Android と互換性があるかどうかを開発者に知らせる API はありますか?

あなたがやろうとしていることは、「真のAndroid互換」ではありません。デバイスは問題ありませんが、あなたの期待はそうではありません。あなたの期待を修正してください。

異なるハードウェア デバイスで動作に違いがある理由。

Android SDK の範囲外のものは、デバイス メーカー次第です。彼らはやりたいことをすることができます。

この種のハードウェアで書き込みを行う別の方法はありますか?

信頼できるものは何もありません。公式の外部ストレージ (getExternalFilesDir() など) を使用してください。または、制御する独自の ROM mod を作成して、存在する非標準のマウント ポイントとその読み取り/書き込み権限の条件を指定し、その ROM mod を任意のデバイスで使用できるようにします。

于 2013-01-08T12:51:23.130 に答える
1

あなたの質問 b: (残念ながら) Android にはまだ実際の標準化がないため、API はメーカーによって異なる可能性があり、多くの場合、デバイス固有の問題に直面する可能性があります。良い例は、Samsung 2.3.x デバイスで null を返す getData() メソッドです。

Environment.getEnternalStorageDirectory()- これは、sd カードを持たないデバイスでのみ内部メモリ ディレクトリを返すと思うので、問題はないと思います。

于 2013-01-08T12:05:09.283 に答える
1

ご意見とアドバイスをくださった Commonsware、Maver1ck に感謝します。

Android アプリケーションは、必ずしも「外部 Sd カード」にアクセスできるとは限りません。すべてのデバイスに「外部 Sd カード」があるわけではありません。したがって、あなたの「必要性」には欠陥があり、交換する必要があります

問題の Android アプリは、特定のニーズに合わせたカスタム アプリケーションであり、典型的な Android マーケット アプリを意図したものではありません。このアプリは、ネットワーク サーバーからデータを取得し、外部 SD カードに保存します。データが巨大であるため、電話のメモリは同じには小さすぎます。

信頼できるものは何もありません。公式の外部ストレージ (getExternalFilesDir() など) を使用してください。または、制御する独自の ROM mod を作成して、存在する非標準のマウント ポイントとその読み取り/書き込み権限の条件を指定し、その ROM mod を任意のデバイスで使用できるようにします。

ROM モジュールについて研究し、この問題をさらに追求します。

于 2013-01-09T11:08:01.210 に答える