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