2012-02-11 198 views
1

我寫的SD卡在我的課,我可以成功地做到這一點,我還可以設置MediaScannerConnection,也是一個OnScanCompletedListener。這所有的作品,但是當我把舉杯提醒掃描已經完成在OnScanCompleteListener用戶,我只是得到了很多來自logcat的和敬酒不出現錯誤,但文件仍然保存到SD卡。OnScanCompletedListener崩潰,因爲吐司

我怎樣才能解決這個問題?

下面更詳細..

寫入SD卡(完美的作品)

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卡上,但我只是得到很多從logcat的和側OnscanCompleteListener不會出現在敬酒的錯誤,我已經試過了沒有面包和它的作品,所以它必須是。

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

我不知道這是什麼意思完全因爲我很新到Android,但我已經解決了這個問題,我所做的是由土司變量的全局,只是在上創建初始化他們一次方法,然後OnScanCompleteListener只需顯示吐司。你認爲這是一個好的解決辦法嗎? – 2012-02-11 16:31:54