最近アンドロイドでの作業を開始しました。アンドロイドアプリケーションと同じネットワークに接続されたラズベリーパイからWiFi経由でファイルを転送するコードスニペットをAndroidアプリケーションに書き込む必要があります。私はJSCHライブラリとコード例を使用していますhere.アンドロイドのリモートサーバーからファイルを取得する
私はこのコードを自分のアンドロイドアプリケーションに含めることを試みました。しかし、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 /にあるので、私は、アプリケーションがクラッシュし、ブロック以外に行くべきではないと考えています。しかし、上記のように、アプリケーション全体がクラッシュします。
私は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/unfortunately-myapp-has-stopped-how-can-i-solve-this – CommonsWare
メインスレッド上でネットワーク操作を実行します。 –
ご協力いただきありがとうございます。 AsyncTaskを使用して操作を実行すると、完全に機能します。 –