1

///編集済み

メインスレッドでプログラムを実行しようとすると、読み取りと保存ができます。

私はasynctaskの問題だと思います!!

///

最初に、Androidマニフェストにユーザー権限を既に追加しています

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

mnt/sdcard/Bluetoothから未加工の画像データを読み取って処理し、内部 sdcard に書き込もうとしましたが、書き込みパスはmnt/sdcard/Bluetoothです。

プログラムは Android エミュレーターで実行でき、ファイルを保存できます。

ただし、実際の電話を実行すると、電話は私のファイルを読み取ることしかできないようですが、ファイルを保存することはできません。

    public class MainActivity extends Activity {
String filenameIn ="ardrone.raw"; 
File file = new File(Environment.getExternalStorageDirectory()+"/Bluetooth/",            filenameIn);
String filename ="convertA.jpg"; 
File outputfile = new File(Environment.getExternalStorageDirectory() +"/Bluetooth/",filename);
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myImageView = (ImageView)findViewById(R.id.imageView);
    Toast.makeText(this, "search raw file", Toast.LENGTH_LONG).show();
    new imageProcess().execute(); 
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://" + Environment.getExternalStorageDirectory())));        
     Bitmap myBitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()
             .getAbsolutePath()+"/Bluetooth/convertA.jpg");
     myImageView.setImageBitmap(myBitmap);

    if (file.exists()){
         Toast.makeText(this, "InFile:)", Toast.LENGTH_LONG).show();
    }
    else{
         Toast.makeText(this, "InFile:(((((", Toast.LENGTH_LONG).show();
    }
    if (outputfile.exists()){
         Toast.makeText(this, "outputfile:)", Toast.LENGTH_LONG).show();
    }
    else{
         Toast.makeText(this, "outputfile:(((((", Toast.LENGTH_LONG).show();
    }

}

public class imageProcess extends AsyncTask<String, Integer, Boolean>{
    Boolean check_point= false;
    @Override
    protected Boolean doInBackground(String... arg0) {

        try {
                receiveVideoRawData();

        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }

            return null;
      }  


}   




public void receiveVideoRawData() throws IOException{
    byte[] buf_rcv = new byte[153600];
    ByteArrayOutputStream ous = new ByteArrayOutputStream();
    InputStream ios = new FileInputStream(file);
    int read = 0;
     while ( (read = ios.read(buf_rcv)) != -1 ) {
               ous.write(buf_rcv, 0, read);
            }
                ous.close();
                ios.close();

        ReadRawFileImage readMyRawData=new ReadRawFileImage();      
        image = readMyRawData.readUINT_RGBImage(buf_rcv);
                    //transfer data
        OutputStream _outStream  = new FileOutputStream(outputfile);
         Bitmap pBitmap = image ;
         pBitmap.compress(Bitmap.CompressFormat.JPEG, 90, _outStream); 
          _outStream.flush();
          _outStream.close();





}
}
4

4 に答える 4

1

まず、パスが存在するかどうかを確認します。異なる電話では、SDカードは異なる場所にマウントされる場合があります。私のLinuxでは、

$ ~/android-sdk-linux/platform-tools/adb shell ls -l /mnt/sdcard/

2つ目は、ファイルと含まれているディレクトリのアクセス許可を確認することです。

次に、ログを調べます(ログにはすでにエラーメッセージが含まれている場合があります)。次に、デバッグ出力をコードに追加し、そのデバッグ出力でログを調べます。

于 2013-03-05T05:36:47.887 に答える
0

まず、実際のデバイスにSDCARDストレージがあることを確認する必要があります(一部のデバイスには「SDCARD」ストレージがありません)。
すべてのストレージリストを取得するには、以下のリファレンスを参照してください。
追加の外部ストレージフォルダ(マウントポイント)を一覧表示するにはどうすればよいですか?

于 2013-03-05T05:41:05.227 に答える
0

file.writable(true) を使用して新しいファイルを書き込み可能にしてみてください。また、新しいファイルが実際には存在しない可能性もあります。

于 2013-03-05T03:31:00.080 に答える
0

どうやら、書き込み権限がない場合にのみ外部読み取り権限を設定する必要があるようですが、これは書き込み権限を上書きしている可能性がありますか? http://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE

于 2013-03-05T04:28:38.977 に答える