package com.sprintwind.packetcapturetool; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class AnalyzeActivity extends Fragment { private final String PCAP_FILE_SUFFIX = ".pcap"; private final int PCAP_MAGIC_SIZE = 4; private final String LOG_TAG = "sprintwind"; private final String CAP_FILE_DIR = "packet_capture"; private EditText edttxtFile; private Button btnBrowse; private Button bttnAnalyze; private ProgressDialog pgsdlgAnalyzing; private View view; private String sdCardPath; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.activity_analyze, container, false); initAnalyzeView(view); return view; } /** 调用文件选择软件来选择文件 **/ private void showFileChooser() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); File captureFilePath = new File(sdCardPath+"/"+CAP_FILE_DIR); Uri uri = Uri.fromFile(captureFilePath); intent.setDataAndType(uri, "*/*"); Log.i(LOG_TAG, uri.toString()); //intent.setType("*/*"); //intent.setAction(android.content.Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_OPENABLE); try { startActivityForResult(Intent.createChooser(intent, "请选择一个要解析的文件"), 1); } catch (android.content.ActivityNotFoundException ex) { // Potentially direct the user to the Market with a Dialog Toast.makeText(AnalyzeActivity.this.getActivity().getApplicationContext(), "没有找到文件管理器,请先安装文件管理器", Toast.LENGTH_SHORT) .show(); } } public class OnAnalyzeButtonClickListener implements OnClickListener { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if(edttxtFile.getText().toString().length() == 0){ Toast.makeText(AnalyzeActivity.this.getActivity().getApplicationContext(), "请先选择一个抓包文件", Toast.LENGTH_SHORT).show(); return; } if(!edttxtFile.getText().toString().endsWith(PCAP_FILE_SUFFIX)){ Toast.makeText(AnalyzeActivity.this.getActivity().getApplicationContext(), "不是pcap格式的文件", Toast.LENGTH_SHORT).show(); return; } pgsdlgAnalyzing.show(); File flCapture = new File(edttxtFile.getText().toString()); InputStream is = null; try{ is = new FileInputStream(flCapture); byte[] bytBuffer = new byte[PCAP_MAGIC_SIZE]; is.read(bytBuffer); /* 判断魔术字是否正确:d4c3b2a1 */ if(bytBuffer[0] != -44 || bytBuffer[1] != -61 || bytBuffer[2] != -78 || bytBuffer[3] != -95 ){ Log.i(LOG_TAG, "bytBuffer[0]:"+bytBuffer[0]+", bytBuffer[1]"+bytBuffer[1]+", bytBuffer[2]"+bytBuffer[2]+", bytBuffer[3]"+bytBuffer[3]); Toast.makeText(AnalyzeActivity.this.getActivity().getApplicationContext(), "抓包文件已损坏", Toast.LENGTH_SHORT).show(); is.close(); pgsdlgAnalyzing.dismiss(); return; } is.close(); } catch(Exception e){ Toast.makeText(AnalyzeActivity.this.getActivity().getApplicationContext(), "打开文件失败,可能不是pcap格式的文件或文件已损坏", Toast.LENGTH_SHORT).show(); pgsdlgAnalyzing.dismiss(); return; } Intent intent = new Intent(AnalyzeActivity.this.getActivity().getApplicationContext(), PacketBriefActivity.class); intent.putExtra("cap_file", edttxtFile.getText().toString()); startActivityForResult(intent, PCAP_MAGIC_SIZE); } } public class OnBrowseBottonClickListener implements OnClickListener { @Override public void onClick(View arg0) { // TODO Auto-generated method stub showFileChooser(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { Uri uri = data.getData(); String url = uri.getPath(); Log.i(LOG_TAG, "url:"+url+", edttxtFile:"+edttxtFile); /* 遇到内存不足导致MainActivity重新加载时,需要重新载入AnalyzeActivity */ if(null == edttxtFile){ initAnalyzeView(view); } edttxtFile.setText(url); pgsdlgAnalyzing.dismiss(); } if(Activity.RESULT_CANCELED == resultCode){ pgsdlgAnalyzing.dismiss(); } Log.i(LOG_TAG, "Activity result:"+resultCode); } private void initAnalyzeView(View view) { edttxtFile = (EditText) view.findViewById(R.id.edttxtFile); btnBrowse = (Button) view.findViewById(R.id.bttnBrowse); bttnAnalyze = (Button) view.findViewById(R.id.bttnAnalyze); btnBrowse.setOnClickListener(new OnBrowseBottonClickListener()); bttnAnalyze.setOnClickListener(new OnAnalyzeButtonClickListener()); pgsdlgAnalyzing = new ProgressDialog(getActivity()); pgsdlgAnalyzing.setProgressStyle(ProgressDialog.STYLE_SPINNER); pgsdlgAnalyzing.setTitle(R.string.analyzing); pgsdlgAnalyzing.setMessage(getString(R.string.waitting_for_analyzing)); pgsdlgAnalyzing.setIndeterminate(false); sdCardPath = android.os.Environment.getExternalStorageDirectory().getAbsolutePath(); } }