0

こんにちは、私は aacplayer アプリを持っていますが、すべての接続を切断すると、wifi + モバイルデータを意味し、アプリを開こうとするとクラッシュし、アプリが開きません。メインアクティビティで次のようなメッセージをユーザーに表示する必要があります。接続がありません。もう一度お試しください。

私のアプリは次のように動作します:

リストビューがあり、xml から多くのラジオ局のデータをロードし、1 つをクリックすると aac プレーヤーが開き、正しく再生されます。また、サービスのストリーミングにも使用します。

アプリのクラッシュを回避するにはどうすればよいですか?

私の主な活動は次のとおりです。

public class Principal extends Activity {

    protected TextView title;
    protected ImageView icon;
    static final String URL = "http://www.streaming507.com/estaciones.xml";
    static final String KEY_ESTACION = "estacion";
    static final String KEY_ID = "id";
    static final String KEY_NOMBRE = "nombre";
    static final String KEY_WEB = "web";
    static final String KEY_SHOUTCAST = "shoutcast";
    static final String KEY_MINIATURA = "miniatura";
    static final String KEY_LOGO = "logo";
    private static final int DIALOG_ALERT = 10;
    public static Activity handleToClose;
    ListView list;
    LazyAdapter adapter;
    private Button botonactualizar;

    public void actualizar() {
        title = (TextView) findViewById(R.id.title);
        icon = (ImageView) findViewById(R.id.icon);
        ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL);
        Document doc = parser.getDomElement(xml);
        NodeList nl = doc.getElementsByTagName(KEY_ESTACION);

        for (int i = 0; i < nl.getLength(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            map.put(KEY_ID, parser.getValue(e, KEY_ID));
            map.put(KEY_NOMBRE, parser.getValue(e, KEY_NOMBRE));
            map.put(KEY_WEB, parser.getValue(e, KEY_WEB));
            map.put(KEY_SHOUTCAST, parser.getValue(e, KEY_SHOUTCAST));
            map.put(KEY_MINIATURA, parser.getValue(e, KEY_MINIATURA));
            map.put(KEY_LOGO, parser.getValue(e, KEY_LOGO));
            songsList.add(map);
        }

        list = (ListView) findViewById(R.id.list);
        adapter = new LazyAdapter(this, songsList);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                String url = ((TextView) view.findViewById(R.id.shoutcast))
                        .getText().toString();
                String logo = ((TextView) view.findViewById(R.id.logo))
                        .getText().toString();

                try {
                    stopService(new Intent(view.getContext(), MyService.class));
                } catch (Exception ex) {
                }

                Intent myIntent = new Intent(view.getContext(),
                        AACPlayerActivity.class);
                myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                myIntent.putExtra("URL", url);
                myIntent.putExtra("LOGO", logo);
                startActivity(myIntent);
            }
        });
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
                R.layout.window_title);
        handleToClose = this;
        actualizar();
        botonactualizar = (Button)findViewById(R.id.botonactualizar);

        botonactualizar.setOnClickListener(new OnClickListener() {

         @Override
         public void onClick(View vw) {
             actualizar();
                Toast.makeText(Principal.this, "Lista de estaciones actualizada",
                        Toast.LENGTH_SHORT).show();
         }
         });


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.layout.menu_opciones1, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case R.id.menu_actualizar:
            actualizar();
            Toast.makeText(Principal.this, "Lista de estaciones actualizada",
                    Toast.LENGTH_SHORT).show();
            return true;

        case R.id.menu_salir:
            showDialog(DIALOG_ALERT);
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_ALERT:
            Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Desea salir de la aplicacion?");
            builder.setCancelable(true);
            builder.setPositiveButton("Si", new OkOnClickListener());
            builder.setNegativeButton("No", new CancelOnClickListener());
            AlertDialog dialog = builder.create();
            dialog.show();
        }
        return super.onCreateDialog(id);
    }

    private final class CancelOnClickListener implements
            DialogInterface.OnClickListener {
        public void onClick(DialogInterface dialog, int which) {
        }
    }

    private final class OkOnClickListener implements
            DialogInterface.OnClickListener {
        public void onClick(DialogInterface dialog, int which) {
            finish();
            stopService(new Intent(Principal.this, MyService.class));
            String ns = Context.NOTIFICATION_SERVICE;
            NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
            mNotificationManager.cancel(1);
        }
    }
}

接続マネージャーと呼ばれるものがあることは知っていますが、メイン アクティビティまたはストリーム サービスのどこにセットアップする必要があるのか​​ わかりません。そのため、インターネットなしでアプリを開くと、メッセージが表示されます。再試行してください。次に更新ボタンを押すと、インターネットがオンになると、Web ページの xml からリストを読み込むことができます。

ありがとうございました。

編集:

インターネットに接続せずにアプリを開くと、このエラーが発生します

ava.net.UnknownHostException: Unable to resolve host "www.mydomain.com": No address associated with hostname

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.spoledge.aacplayer/com.spoledge.aacplayer.Principal}: java.lang.NullPointerException
4

2 に答える 2

1

このようなメソッドをあなたのActivity...

private boolean isConnected() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}

ストリーミングを開始する前onResume()に、またはいつでも内部から呼び出します。Activity

于 2012-10-26T01:13:47.897 に答える
0

私はこれを修正して、このコードを私のメインアクティビティに追加します:

public boolean isOnline() {
        ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        try {
            if (connectionManager.getActiveNetworkInfo().isConnected()) {
                Log.d("ConStatus", "Data Connection On");
                return true;
            } else {
                Log.d("ConStatus", "Data Connection off");
                return false;           
            }
        } catch (NullPointerException e) {
            // No Active Connection
            Log.i("ConStatus", "No Active Connection");
            return false;
        }
    }

次にoncreate:

} else {
                Log.d("Connection Status", "Connection Not Available");

                AlertDialog alertDialog = new AlertDialog.Builder(this).create();
                alertDialog.setTitle("No hay conexion a internet disponible");
                alertDialog.setMessage("La conexion a Internet es necesaria para el uso de esta aplicacion.");
                alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // here you can add functions

                        finish();
                    }
                });
                alertDialog.show();
            }
        } catch(NullPointerException e){
                    Log.d("Connection Status", "Connection Not Available");

                    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
                    alertDialog.setTitle("No hay conexion a internet disponible");
                    alertDialog.setMessage("La conexion a Internet es necesaria para el uso de esta aplicacion.");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int which) {
                          // here you can add functions

                        finish();
                       }
                    });
                    alertDialog.show();
                }
    }

これで動作します。アクティビティを開始する前に、接続を確認し、ユーザーがインターネットに接続していない場合はダイアログを表示してから、アクティビティを閉じます。

ありがとうございました

于 2012-10-26T16:36:40.830 に答える