2013-03-05 2 views
1

///이 쓰기 파일

내가 메인 스레드에서 프로그램을 실행하려고하고 읽고 저장할 수 있습니다

편집 SD_Card합니다. 내가 생각

은 AsyncTask를의 문제이다!

///

우선은 벌써 안드로이드 매니페스트

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

내가/SDCARD/블루투스MNT에서 원시 이미지 데이터를 읽으려고하고 처리를하고에 대한 사용자 권한을 추가 내부 sdcard에 쓰기 및 쓰기 경로는 mnt/sdcard/Bluetooth입니다.

이 프로그램은 내 안드로이드 에뮬레이터에서 실행하고 파일을 저장할 수 있습니다. 실제 전화를 실행할 때

그러나, 전화가 단지 내 파일을 읽을 수 있지만 파일을 저장할 수 없습니다 것으로 보인다.

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(); 





} 
} 
+1

당신은 백그라운드 작업에서 이미지 파일을 저장하지만, 디코딩 작업을 즉시 시작 후 메인 스레드에서 이미지를 표시하는 시도를 얻을 참조 아래를 참조하시기 바랍니다. 백그라운드 저장이 읽으려고하는 지점까지 완료 했습니까? 경쟁 조건처럼 보입니다. – Devunwired

답변

0

file.writable (true)을 사용하여 새 파일을 쓰기 가능으로 설정해보십시오. 새로운 파일이 실제로 존재하지 않을 수도 있습니다.

+0

outputfile.setWritable (true); 아직 저장하지 않음 :( – DekangHu

+0

토스트 메시지에 파일이 있는지 여부를 알려주시겠습니까? –

1

가장 먼저 할 일은 경로가 존재하는지 확인하는 것입니다. 다른 전화에 SD 카드는 다른 위치에 장착 될 수 있습니다. 내 Linux에서

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

제 2 점은 파일을 포함하는 디렉토리에 대한 사용 권한을 확인하는 것입니다.

그렇다면, 당신은 (이미 오류 메시지가 포함될 수 있습니다) 로그를 검사 할 수있다; 그런 다음 디버그 출력을 코드에 추가하고 해당 디버그 출력을 사용하여 로그를 검사하십시오.