我最近開始使用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" />
使用LogCat檢查與您的崩潰相關的Java堆棧跟蹤:https://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can-i-solve-this – CommonsWare
您不能在主線程上執行網絡操作。 –
感謝您的幫助。使用AsyncTask來執行操作,它完美地工作。 –