Android: фатальная исключительная ситуация: попытка вызова метода нажатием кнопки - PullRequest
3 голосов
/ 07 декабря 2010

Я немного новичок в написании приложений и работаю над школьным проектом.Я только что закончил программу, сейчас просто отлаживаю.У меня есть серьезная проблема, которая не может обойтись путем вызова метода одним нажатием кнопки.Программа предназначена для загрузки файла после того, как пользователь введет поисковый запрос.

Первоначально мой logcat говорил мне, что метод не может быть найден в классе HelloTabWidget.Первоначально у меня был метод findSong в классе SearchActivity, поэтому я переместил почти весь код из SearchActivity в HelloTabWidget, поскольку это все равно казалось простым способом увидеть все.Теперь я попробовал подсказку об изменении пути в xml для onClick, но это тоже не помогло.Вместо этого я получил предыдущую ошибку: «не удалось найти метод com.android.iPirate.HelloTabWidget.findSong в действии HelloTabWidget ...» Я начинаю думать, что это связано с добавленным исключением в методе.Но я практически не знаю, что можно сделать, чтобы это исправить.Любая помощь будет оценена.

Вот HelloTabWidget:

package com.android.iPirate;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

>import android.app.Activity;
import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TabHost;
import android.widget.TextView;


public class HelloTabWidget extends TabActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Reusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, SearchActivity.class);

        // Initialize a TabSpec for each tab and add it to the TabHost


        // Do the same for the other tabs

        intent = new Intent().setClass(this, SongsActivity.class);
        spec = tabHost.newTabSpec("songs").setIndicator("Songs",
                          res.getDrawable(R.drawable.ic_tab_artists))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, SettingsActivity.class);
        spec = tabHost.newTabSpec("settings").setIndicator("Instructions",
                          res.getDrawable(R.drawable.ic_tab_settings))
                      .setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(2); }

    public String searchTerm;
    public String quotes = "";
    public String title;
    public EditText edittext;
    public String youTubeURL;
    public Set<String> names = new HashSet<String>();


        public void findSong(View view) throws Exception {
            edittext = (EditText) findViewById(R.id.edittext); 
            searchTerm = edittext.getText().toString();
            String address;
            address = getURL(searchTerm);
            UrlDownload.fileUrl(address, title + ".mp3", "/");
        }

        public void findPlaylist(View view) throws Exception{
            findSong(view);
            String[] pageNames = getLinks(youTubeURL);
            for(String name : pageNames)
                if (!names.contains(name))
                    UrlDownload.fileUrl(getURL(name), title + ".mp3", "/");
        }

        public static String[] getLinks(String link) throws Exception {
            URL url = new URL(link);
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                    url.openStream()));
            Scanner input = new Scanner(in);
            String[] songs = new String[15];
            for(int i = 0; i < 15; i++)
                songs[i] = nextTitle(input);
            return songs;
        }

        public static String nextTitle(Scanner input){
            while (input.hasNextLine()){
                String inputLine = input.nextLine();
                if (inputLine.contains("<span dir=\"ltr\" class=\"title\" title=\"")){
                    return inputLine.substring
                    (inputLine.indexOf("<span dir=\"ltr\" class=\"title\" title=\"") + 37, inputLine.indexOf(">")-1);
                }
            }
            return null;
        }

        public String getURL(String searchString) throws Exception {
            String searchQuery = searchString.replace(' ','+');
            String siteURL = new String("http://www.youtube.com/results?search_query="+searchQuery+ "&aq=f\"");
            URL url;
            url = new URL(siteURL);
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            Scanner input = new Scanner(in);
            String videoLink = "";
            String fLink = null;
            while(input.hasNextLine()){
                String line = input.nextLine();
                if(line.contains("<!-- start search results -->")){
                    for(int i = 0; i <= 44; i++){
                        line = input.nextLine();
                    }
                    youTubeURL = "www.youtube.com/"+line.substring(line.indexOf("<a href=")+8, line.indexOf("class")-2);
                    videoLink = "http://www.video2mp3.net/index.php?url=" + youTubeURL;
                    title = line.substring(line.indexOf("title="+6),line.indexOf(quotes,line.indexOf("title")+7)-1);
                    names.add(title);
                    break;
                }
            }
            URL vurl = null;
            vurl = new URL(videoLink);
            BufferedReader in2;
            in2 = new BufferedReader(new InputStreamReader(vurl.openStream()));
            Scanner input2 = new Scanner(in2);
            while(input2.hasNextLine()){
                String line = input.nextLine();
                if(line.contains("Conversion successfully completed!")){
                    line = input.nextLine();
                    line = input.nextLine();
                    fLink = line.substring(line.indexOf("http"),line.indexOf("/'"));
                    break;
                }
            }
            URL furl;
            furl = new URL(fLink);
            BufferedReader in3 = new BufferedReader(new InputStreamReader(furl.openStream()));
            Scanner input3 = new Scanner(in3);
            while(input3.hasNextLine()){
                String line = input.nextLine();
                if(line.contains("Wait 20 seconds or click here")){
                    line = input.nextLine();
                    String line2 = input.nextLine();
                    String line3 = input.nextLine();
                    String line4 = input.nextLine();
                    if(line2.contains(".mp3"))
                        return line.substring(line.indexOf("tt"+3)) + line2.substring(0,line2.indexOf(".mp3")+4);
                    else if(line3.contains(".mp3"))
                        return line.substring(line.indexOf("tt"+3)) + line2 + line3.substring(0,line3.indexOf(".mp3")+4);
                    else if(line4.contains(".mp3")){
                        return line.substring(line.indexOf("tt"+3)) + line2 + line3 + line4.substring(0,line4.indexOf(".mp3")+4);
                    }
                }
            }   
            return "";
        }

        public void savemp3(String s) throws Exception{
            URLConnection conn = new URL(s).openConnection();
            InputStream is = conn.getInputStream();

            OutputStream outstream = new FileOutputStream(new File(title + ".mp3"));
            byte[] buffer = new byte[4096];
            int len;
            while ((len = is.read(buffer)) > 0) {
                outstream.write(buffer, 0, len);
            }
            outstream.close();
        }
    }

Теперь XML:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">
        <EditText
        android:id="@+id/edittext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
        <Button
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Find Song"
        android:onClick="findSong" />
        <Button
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Find Playlist"
        android:onClick="findPlaylist" />

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp"/>




    </LinearLayout>
</TabHost>

Манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.iPirate"
     android:versionCode="1"
     android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".HelloTabWidget"
                 android:label="@string/app_name"
                 android:theme="@android:style/Theme.NoTitleBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    <activity android:name=".SettingsActivity"
                 android:label="@string/app_name"
                 android:theme="@android:style/Theme.NoTitleBar">
        </activity>
  <activity android:name=".SearchActivity"
                 android:label="@string/app_name"
                 android:theme="@android:style/Theme.NoTitleBar">
        </activity>
          <activity android:name=".SongsActivity"
                 android:label="@string/app_name"
                 android:theme="@android:style/Theme.NoTitleBar">
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="8" />

</manifest>

и Logcat:

12-06 14:35:33.603: ERROR/AndroidRuntime(4157): FATAL EXCEPTION: main
12-06 14:35:33.603: ERROR/AndroidRuntime(4157): java.lang.IllegalStateException: Could not execute method of the activity
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.view.View$1.onClick(View.java:2072)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.view.View.performClick(View.java:2408)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.view.View$PerformClick.run(View.java:8816)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.os.Handler.handleCallback(Handler.java:587)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.os.Looper.loop(Looper.java:123)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at java.lang.reflect.Method.invokeNative(Native Method)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at java.lang.reflect.Method.invoke(Method.java:521)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at dalvik.system.NativeStart.main(Native Method)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157): Caused by: java.lang.reflect.InvocationTargetException
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at com.android.iPirate.HelloTabWidget.findSong(HelloTabWidget.java:71)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at java.lang.reflect.Method.invokeNative(Native Method)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at java.lang.reflect.Method.invoke(Method.java:521)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at android.view.View$1.onClick(View.java:2067)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     ... 11 more
12-06 14:35:33.603: ERROR/AndroidRuntime(4157): Caused by: java.net.SocketException: Permission denied
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at java.net.Socket.checkClosedAndCreate(Socket.java:873)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at java.net.Socket.connect(Socket.java:1020)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1152)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at java.net.URL.openStream(URL.java:653)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     at com.android.iPirate.HelloTabWidget.getURL(HelloTabWidget.java:111)
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):     ... 15 more

Спасибо за любую помощь.

Новый logcat:

>12-06 16:34:30.585: ERROR/AndroidRuntime(4870): FATAL EXCEPTION: main
12-06 16:34:30.585: ERROR/AndroidRuntime(4870): java.lang.IllegalStateException: Could not execute method of the activity
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.view.View$1.onClick(View.java:2072)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.view.View.performClick(View.java:2408)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.view.View$PerformClick.run(View.java:8816)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.os.Handler.handleCallback(Handler.java:587)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.os.Looper.loop(Looper.java:123)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at java.lang.reflect.Method.invokeNative(Native Method)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at java.lang.reflect.Method.invoke(Method.java:521)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at dalvik.system.NativeStart.main(Native Method)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870): Caused by: java.lang.reflect.InvocationTargetException
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at com.android.iPirate.HelloTabWidget.findSong(HelloTabWidget.java:71)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at java.lang.reflect.Method.invokeNative(Native Method)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at java.lang.reflect.Method.invoke(Method.java:521)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at android.view.View$1.onClick(View.java:2067)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     ... 11 more
12-06 16:34:30.585: ERROR/AndroidRuntime(4870): Caused by: java.net.MalformedURLException: Protocol not found: 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at java.net.URL.<init>(URL.java:275)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at java.net.URL.<init>(URL.java:159)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     at com.android.iPirate.HelloTabWidget.getURL(HelloTabWidget.java:129)
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):     ... 15 more

И спасибо людям, которые помогают мне с цитатами.Не могу понять их!: D

Ответы [ 6 ]

2 голосов
/ 07 декабря 2010

Я подозреваю, что это потому, что вы открываете сокет, но не объявили разрешение INTERNET.Попробуйте добавить это в свой манифест за пределами тега .

<uses-permission android:name="android.permission.INTERNET"/>
1 голос
/ 19 июля 2012

Никогда не пытайтесь переименовать основной класс при создании из eclipse.

создайте новый проект и добавьте файлы.и попробуйте снова запустить.

0 голосов
/ 25 мая 2012

Я однажды использовал TabHost и получил очень похожую ошибку, как и вы. Ошибка в моем случае была в моем Манифесте. Я сделал ошибку заклинания, действие, которое я добавил в манифест, было написано так: .list вместо .List - вот что заставило меня получить ошибку. Единственное, что было не так, это просто одна буква не в верхнем регистре :). Чтобы найти ошибку, сначала поместите свой код в блок try catch для большего контроля, и это поможет вам выяснить, какие именно исключения генерируются и почему. А после этого вы, вероятно, найдете свою проблему.

0 голосов
/ 07 декабря 2010

Судя по последним выводам logcat, кажется, что передаваемый вами URL неверен.попробуйте войти в URL, используя Log.d(), и посмотрите, как на самом деле выглядит URL.

0 голосов
/ 07 декабря 2010

Какая строка в вашем файле HelloTabWidget.java является строкой 111?У вас SocketException повышается в вашем методе getURL ().

0 голосов
/ 07 декабря 2010

Мое предложение не устанавливать onCLickLIsteners в XML.Сделайте это в коде.

...