2017-09-12 102 views
0

我最近開始使用Android,我必須在我的android應用程序中編寫代碼片段,該代碼片段通過WiFi從連接到與我的android應用程序相同的網絡的Raspberry pi上傳輸文件。我正在使用JSCH庫和給出的代碼示例here.從android中的遠程服務器獲取文件

我試圖在我的android應用程序中包含此代碼。但是,在try/Except塊中,我的應用程序在session.connect()命令中崩潰。我似乎無法弄清楚這裏的問題。代碼編譯和構建正常。我直接在我的android手機而不是模擬器上運行它。應用程序在啓動時崩潰,即使此操作是通過按下按鈕啓動的。

有人可以幫我嗎?

public class ft_mainpage extends AppCompatActivity{ 

Spinner spinner; 
String[] paths = {"Red Tripple Band Pass","Water Level Index","Blue Tripple Band Pass", "RGB"}; 
TextView tv; 

//////////////// 

//////////////// 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_ft_mainpage); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

    tv = (TextView)findViewById(R.id.ft_mainpage_tv); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(ft_mainpage.this, android.R.layout.simple_spinner_item, paths); 
    spinner = (Spinner)findViewById(R.id.ft_main_spinner); 
    spinner.setAdapter(adapter); 
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
      int position = spinner.getSelectedItemPosition(); 
      switch(position){ 
       case 1: 
        tv.setText("RTBP - Fetching Information"); 

        Session session = null; 
        Channel channel = null; 
        ChannelSftp channelSftp = null; 

        try{ 
         JSch ssh = new JSch(); 
         session = ssh.getSession("pi","10.0.1.170",22); 
         session.setPassword("raspberry"); 
         java.util.Properties config = new java.util.Properties(); 
         config.put("StrictHostKeyChecking", "no"); 
         session.setConfig(config); 
         session.connect(); 
         channel = session.openChannel("sftp"); 
         channel.connect(); 
         channelSftp = (ChannelSftp) channel; 
         channelSftp.cd("/home/pi/Desktop/"); 
         byte[] buffer = new byte[1024]; 
         BufferedInputStream bis = new BufferedInputStream(channelSftp.get("Test.java")); 
         File newFile = new File(Environment.DIRECTORY_DOWNLOADS); 
         OutputStream os = new FileOutputStream(newFile); 
         BufferedOutputStream bos = new BufferedOutputStream(os); 
         int readCount; 
         while ((readCount = bis.read(buffer)) > 0) { 
          System.out.println("Writing: "); 
          bos.write(buffer, 0, readCount); 
         } 
         bis.close(); 
         bos.close(); 

        }catch (Exception ex){ 
         ex.printStackTrace(); 
        } 


        break; 
       case 0: 
        tv.setText("WLI"); 
        break; 
       case 2: 
        tv.setText("RTBP"); 
        break; 
       case 3: 
        tv.setText("RGB"); 
        break; 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> adapterView) { 
      int a =0; 
     } 
    }); 

} 

即使出現在我獲取文件的方式中的一些錯誤,導致錯誤的代碼是在try/except塊,所以我認爲應用程序不應該崩潰,並轉到除塊。但是,如上所述,整個應用程序崩潰。

我有以下權限在我的Android清單

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
+1

使用LogCat檢查與您的崩潰相關的Java堆棧跟蹤:https://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can-i-solve-this – CommonsWare

+1

您不能在主線程上執行網絡操作。 –

+0

感謝您的幫助。使用AsyncTask來執行操作,它完美地工作。 –

回答

0

「一個人」的評論是正確的。

你必須在後臺執行網絡操作,使用AsyncTask或類似的東西。

+0

感謝您的回覆。我使用AsyncTask執行了包含網絡操作的代碼,並且完美運行。 –

相關問題