2012-02-11 4 views
1

내 클래스의 SD 카드에 쓰고 있는데 성공적으로 할 수 있으며 MediaScannerConnection과 OnScanCompletedListener도 설정할 수 있습니다. 그 모든 작동하지만 내가 OnScanCompleteListener에서 스캔이 완료되었습니다 사용자에게 경고하기 위해 축배를 넣을 때 LogCat에서 많은 오류가 발생하고 토스트가 나타나지 않지만 파일은 여전히 ​​SD 카드에 저장됩니다.토스터 때문에 OnScanCompletedListener가 깨졌습니다.

어떻게 해결할 수 있습니까?

아래

더 자세히 ..

InputStream is = getResources().openRawResource(R.drawable.greenball); 
       OutputStream os = new FileOutputStream(file); 
       byte[] data = new byte[is.available()]; 
       is.read(data); 
       os.write(data); 
       is.close(); 
       os.close(); 

OnScanCompletedListener, 단지 내부의 토스트와 함께 작동하지 않습니다 (완벽하게 작동) SD 카드에 쓰기? 아직 SD 카드에 파일을 저장하지만 Logcat과 OnstanCompleteListener가 표시되지 않는 토스트에서 많은 오류가 발생합니다. 토스트없이 시도 했으므로 작동해야합니다.

MediaScannerConnection.scanFile(ExternalData.this, 
new String[] {file.toString()}, 
null, 
new MediaScannerConnection.OnScanCompletedListener() { 

          public void onScanCompleted(String path, Uri uri) { 
           // TODO Auto-generated method stub 
           Toast t = Toast.makeText(ExternalData.this, "scan complete", Toast.LENGTH_SHORT); 
           t.show(); 
          } 
         }); 

어떤 도움을 내가 주위를 검색 한 그냥 캔트이 아무것도 찾을 좋은 것

02-11 15:34:39.896: E/JavaBinder(11134): java.lang.RuntimeException: Can't create 
handler inside thread that has not called Looper.prepare() 

02-11 15:34:39.896: E/JavaBinder(11134): at android.os.Handler.<init> 
(Handler.java:121) 

02-11 15:34:39.896: E/JavaBinder(11134): at 
android.widget.Toast.makeText(Toast.java:231) 

로그 고양이 오류의 일부. 내가 만든 간단한 오류가 있다면 고맙습니다. 잘못된 스레드에서

IMPORTS... 

public class ExternalData extends Activity implements OnClickListener, 
OnItemSelectedListener { 

TextView canWrite, canRead; 
String state; 
boolean canW, canR; 
Spinner spinner; 
String[] paths = { "Music", "Pictures", "Download" }; 
File path = null; 
File file = null; 
EditText saveFile; 
Button confirm, save; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.externaldata); 


    canWrite = (TextView) findViewById(R.id.tvCanWrite); 
    canRead = (TextView) findViewById(R.id.tvCanRead); 
    confirm = (Button) findViewById(R.id.bConfirmSaveAs); 
    save = (Button) findViewById(R.id.bSaveFile); 
    saveFile = (EditText) findViewById(R.id.etSaveAs); 
    confirm.setOnClickListener(this); 
    save.setOnClickListener(this); 

    checkState(); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(ExternalData.this, android.R.layout.simple_spinner_item, paths); 

    spinner = (Spinner) findViewById(R.id.spinner1); 
    spinner.setAdapter(adapter); 
    spinner.setOnItemSelectedListener(this); 


} 

private void checkState() { 
    // TODO Auto-generated method stub 
    state = Environment.getExternalStorageState(); 
    if (state.equals(Environment.MEDIA_MOUNTED)) { 
     // read and write 
     canWrite.setText("true"); 
     canRead.setText("true"); 
     canW = canR = true; 

    } else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { 
     // read but can't write 
     canWrite.setText("false"); 
     canRead.setText("true"); 
     canW = false; 
     canR = true; 

    } else { 
     canWrite.setText("false"); 
     canRead.setText("false"); 
     canW = canR = false; 
    } 

} 



@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()){ 
    case R.id.bSaveFile: 
     String f = saveFile.getText().toString(); 
     file = new File(path, f + "png"); 
     checkState(); 
     if (canW == canR == true){ 
      path.mkdir(); 
      try { 
       InputStream is =  
     getResources().openRawResource(R.drawable.greenball); 
       OutputStream os = new FileOutputStream(file); 
       byte[] data = new byte[is.available()]; 
       is.read(data); 
       os.write(data); 
       is.close(); 
       os.close(); 

       Toast t = Toast.makeText(ExternalData.this, "File has been Saved", Toast.LENGTH_LONG); 
       t.show(); 

       //Update files for the user to use 
       MediaScannerConnection.scanFile(ExternalData.this, 
         new String[] {file.toString()}, 
         null, 
         new MediaScannerConnection.OnScanCompletedListener() { 

          public void onScanCompleted(String path, Uri uri) { 
           // TODO Auto-generated method stub 
           Toast t = Toast.makeText(ExternalData.this, "Scan Complete", Toast.LENGTH_SHORT); 
           t.show(); 
          } 
         }); 


      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     break; 
    case R.id.bConfirmSaveAs: 
     save.setVisibility(View.VISIBLE); 
     break; 
    } 

} 

@Override 
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
     long arg3) { 
    // TODO Auto-generated method stub 
    int position = spinner.getSelectedItemPosition(); 
    switch (position){ 

    case 0: 
     path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); 
     break; 
    case 1: 
     path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     break; 
    case 2: 
     path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
     break; 

    } 
} 

@Override 
public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub 

} 

}

답변

2

당신은 호출 makeToast :

는 여기 도움이 단지의 경우이 클래스 내 전체 코드입니다. 최종 핸들러를 작성하고 makeToast를 게시하십시오.

final Handler handler = new Handler(); 
MediaScannerConnection.scanFile..... 
    handler.post(new Runable()... 
+0

, 내가 한 모든 토스트 변수는 글로벌 만들어 단지에 만들기로 한 번에 초기화됩니다 나는 안드로이드 아주 새로운 해요 이후 그 완전히 무슨 뜻인지 모르겠지만, 문제를 해결했습니다 메서드를 호출 한 다음 OnScanCompleteListener가 축배를 표시하면됩니다. 이게 괜찮은 해결책이라고 생각하세요? –