Android 용으로 개발 된 앱에 문제가 있습니다.
JSON 파서를 통해 Google Translate API에서 데이터를 가져 오려고합니다.
응용 프로그램이 에뮬레이터 (v 2.1) 및 T-Mobile Move Balance (v 2.3.5)에서 완벽하게 작동합니다. 문제는 Android 4.0.4 (ZTE 블레이드 III 장치)에서 발생합니다. 데이터를 가져 오려고하면 null 포인터 (try-catch 블록으로 둘러싸인 NullPointerException)을 반환합니다.
내가 매니페스트 또는 설정 구성에 오류가 장치에 생각 매니페스트android 4.0.4에서 인터넷 데이터를 가져올 수 없습니다.
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
에서 응용 프로그램 권한 '이 (이미 인터넷 연결을 확인하고 다른 응용 프로그램과 함께 작동합니다. 브라우저도 작동) 응용 프로그램이 잘 작동하기 때문에, 이전 버전에서는
도움이 될 것입니다. 미리 감사드립니다.
나는 ...
는 버튼public class OptionsActivity extends Activity {
private String mSourceLanguage, mDestinationLanguage;
private Spinner sourceSpinner, destinationSpinner;
private static ArrayList<Language> languages;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_options);
sourceSpinner = (Spinner)findViewById(R.id.spinner1);
destinationSpinner = (Spinner)findViewById(R.id.spinner2);
updateSpinners();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_options, menu);
return true;
}
// isprakjanje na informacii na jazicite do ManuaInputActivity
public void submitLanguages(View v){
mSourceLanguage = sourceSpinner.getSelectedItem().toString();
mDestinationLanguage = destinationSpinner.getSelectedItem().toString();
String sourceCode = "", destCode = "";
sourceCode = getCode(mSourceLanguage);
destCode = getCode(mDestinationLanguage);
Intent intent = new Intent(this, ManualInputActivity.class);
Bundle spinnerBundle = new Bundle();
spinnerBundle.putString("sourceLanguage", mSourceLanguage + " ["+ sourceCode + "]");
spinnerBundle.putString("sourceCode", sourceCode);
spinnerBundle.putString("destinationLanguage", mDestinationLanguage + " [" + destCode + "]");
spinnerBundle.putString("destinationCode", getCode(mDestinationLanguage));
intent.putExtras(spinnerBundle);
setResult(RESULT_OK, intent);
super.finish();
}
// moze da mi treba pokasno za polnenje na spinner-ite
private ArrayAdapter<String> initializeSpinner(ArrayList<Language> lang){
ArrayList<String> entries = new ArrayList<String>();
for(Language l: lang){
entries.add(l.getLanguageName());
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,entries);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
return spinnerAdapter;
}
private void updateSpinners(){
GoogleRequest gr = new GoogleRequest();
try {
String result = gr.requestLanguages("en");
languages = gr.getLanguagesFromJSONObject(result);
sourceSpinner.setAdapter(initializeSpinner(languages));
destinationSpinner.setAdapter(initializeSpinner(languages));
} catch (NullPointerException e) {
// TODO: handle exception
Toast.makeText(this, "Empty spinners.. NO DATA...", Toast.LENGTH_SHORT).show();
}
}
private String getCode(String s){
String ss="xx";
for (Language l : languages){
if(l.getLanguageName().toString()==s)
ss = l.getLanguageCode().toString();
}
return ss;
}
}
과 GoogleRequest 클래스에서 청취자와 함께, 여기에
하나 개의 버튼과 두 개의 스피너와 활동이 필요하지 않습니다 생각
public class GoogleRequest {
private final String requestURL = "https://www.googleapis.com/language/translate/v2?key=";
private final String requestURLLang = "https://www.googleapis.com/language/translate/v2/languages?key=";
private final String requestKey = "**************";
private final String requestSrc = "&source=";
private final String requestDst = "&target=";
private final String requestTxt = "&q=";
public String requestLanguages(String target){
String request = requestURLLang + requestKey + requestDst + target;
try {
URL url = new URL(request);
URLConnection connection = url.openConnection();
connection.connect();
InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream(), "UTF-8");
BufferedReader in = new BufferedReader(inputStreamReader, 512);
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();
return sb.toString();
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String requestTranslation(String txt, String src, String dst) {
String request = requestURL + requestKey + requestSrc + src + requestDst + dst + requestTxt;
try {
request += URLEncoder.encode(txt, "UTF-8");
URL url = new URL(request);
URLConnection connection = url.openConnection();
connection.connect();
InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream(), "UTF-8");
BufferedReader in = new BufferedReader(inputStreamReader, 512);
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();
return sb.toString();
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String getTextFromJSONObject(String text){
try{
JSONObject mainObj = new JSONObject(text);
JSONObject data = mainObj.getJSONObject("data");
JSONArray translations = data.getJSONArray("translations");
String result = "";
for(int i=0; i <translations.length(); i++){
JSONObject translatedText = translations.getJSONObject(i);
result += translatedText.getString("translatedText");
}
return result;
}catch (JSONException e) {
// TODO: handle exception
Toast.makeText(null, "Parsing error!", Toast.LENGTH_SHORT).show();
return null;
}
}
public ArrayList<Language> getLanguagesFromJSONObject(String text){
ArrayList<Language> googleLanguages = new ArrayList<Language>();
try {
JSONObject mainObj = new JSONObject(text);
JSONObject data = mainObj.getJSONObject("data");
JSONArray languages = data.getJSONArray("languages");
for(int i=0; i<languages.length(); i++){
Language l = new Language();
JSONObject language = languages.getJSONObject(i);
l.setLanuguageCode(language.getString("language"));
l.setLanuguageName(language.getString("name"));
googleLanguages.add(l);
}
return googleLanguages;
} catch (JSONException e) {
Toast.makeText(null, "Parsing error!", Toast.LENGTH_SHORT).show();
return null;
}
}
public String printLista(ArrayList<Language> l){
String s="";
for(Language la: l){
s+= la.getLanguageName().toString() + " [" + la.getLanguageCode().toString() + "]";
}
return s;
}}
옵션 레이아웃 ...
과 로그 캣 :
02-10 06:01:49.941: E/AndroidRuntime(10653): FATAL EXCEPTION: main
02-10 06:01:49.941: E/AndroidRuntime(10653): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.textshottranslator/com.example.textshottranslator.OptionsActivity}: java.lang.NullPointerException
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1976)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2001)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.ActivityThread.access$600(ActivityThread.java:130)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1163)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.os.Handler.dispatchMessage(Handler.java:99)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.os.Looper.loop(Looper.java:137)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.ActivityThread.main(ActivityThread.java:4444)
02-10 06:01:49.941: E/AndroidRuntime(10653): at java.lang.reflect.Method.invokeNative(Native Method)
02-10 06:01:49.941: E/AndroidRuntime(10653): at java.lang.reflect.Method.invoke(Method.java:511)
02-10 06:01:49.941: E/AndroidRuntime(10653): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
02-10 06:01:49.941: E/AndroidRuntime(10653): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
02-10 06:01:49.941: E/AndroidRuntime(10653): at dalvik.system.NativeStart.main(Native Method)
02-10 06:01:49.941: E/AndroidRuntime(10653): Caused by: java.lang.NullPointerException
02-10 06:01:49.941: E/AndroidRuntime(10653): at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
02-10 06:01:49.941: E/AndroidRuntime(10653): at org.json.JSONTokener.nextValue(JSONTokener.java:94)
02-10 06:01:49.941: E/AndroidRuntime(10653): at org.json.JSONObject.(JSONObject.java:154)
02-10 06:01:49.941: E/AndroidRuntime(10653): at org.json.JSONObject.(JSONObject.java:171)
02-10 06:01:49.941: E/AndroidRuntime(10653): at com.example.textshottranslator.GoogleRequest.getLanguagesFromJSONObject(GoogleRequest.java:99)
02-10 06:01:49.941: E/AndroidRuntime(10653): at com.example.textshottranslator.OptionsActivity.updateSpinners(OptionsActivity.java:76)
02-10 06:01:49.941: E/AndroidRuntime(10653): at com.example.textshottranslator.OptionsActivity.onCreate(OptionsActivity.java:27)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.Activity.performCreate(Activity.java:4494)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
02-10 06:01:49.941: E/AndroidRuntime(10653): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1940)
02-10 06:01:49.941: E/AndroidRuntime(10653): ... 11 more
로그 캣 그렇게 보이는 경우 updateSpinners() 메소드는 다음과 같이 수정 :
private void updateSpinners(){
GoogleRequest gr = new GoogleRequest();
String result = gr.requestLanguages("en");
languages = gr.getLanguagesFromJSONObject(result);
sourceSpinner.setAdapter(initializeSpinner(languages));
destinationSpinner.setAdapter(initializeSpinner(languages));
try {
} catch (NullPointerException e) {
// TODO: handle exception
Toast.makeText(this, "THIS IS IRRELEVANT NOW ...", Toast.LENGTH_SHORT).show();
}
}
포스트 전체 코드를 첨부 로그 캣 스택 추적을 해결하는 데 도움이 될 수있는 링크 http://steveliles.github.com/android_s_asynctask.html입니다. –