2017-09-12 9 views
0

最近アンドロイドでの作業を開始しました。アンドロイドアプリケーションと同じネットワークに接続されたラズベリーパイから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" /> 
+1

LogCatを使用して、クラッシュに関連するJavaスタックトレースを調べます。https://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this – CommonsWare

+1

メインスレッド上でネットワーク操作を実行します。 –

+0

ご協力いただきありがとうございます。 AsyncTaskを使用して操作を実行すると、完全に機能します。 –

答えて

0

で次の権限を持っている「人」のコメントは正しいです。

AsyncTaskなどを使用して、バックグラウンドでネットワーク操作を行う必要があります。

+0

お返事ありがとうございます。 AsyncTaskでネットワーク操作を含むコードを実行したところ、完全に機能しました。 –

関連する問題