2012-02-11 70 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