我在编写应用程序方面有点新手,我正在做一个学校项目。我刚刚完成程序,现在只是调试。我遇到了一个似乎无法解决的主要问题,涉及通过单击按钮调用方法。该程序旨在在用户输入搜索词后下载文件。
最初,我的 logcat 告诉我在 HelloTabWidget 类中找不到该方法。我最初在 SearchActivity 类中有 findSong 方法,因此我将 SearchActivity 中的几乎所有代码都移到了 HelloTabWidget 中,因为无论如何这似乎是一种查看所有内容的简单方法。现在,我在这里尝试了从 onClick 更改 xml 中的路径的提示,但这也没有解决它。相反,我从之前得到了过去的错误:“在活动 HelloTabWidget 中找不到方法 com.android.iPirate.HelloTabWidget.findSong ...”我开始认为这与方法中添加的异常有关。但我几乎不知道可以做些什么来解决这个问题。任何帮助,将不胜感激。
这是 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
谢谢你的帮助。
新的日志猫:
>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