java - seguridad - La aplicación funciona bien en el emulador, pero se bloquea en el dispositivo real
error de aplicacion no se ha podido iniciar la aplicacion java (2)
Hay muchos problemas en diferentes dispositivos y las versiones de Android con la búsqueda de una ruta de acceso real al Almacenamiento externo (si está disponible) parece que se enfrentó a uno de ellos, consulte esta pregunta , espero que le ayude a encontrar una solución para su tarea.
He intentado hacer una aplicación que analiza archivos xml. En el emulador funciona bien, pero cuando lo ejecuto en un dispositivo real, un teléfono Android y una tableta Android, se cuelga ...
Este es el MainActivity.java
public class MainActivity extends ActionBarActivity {
public List<UnitModel> model = null;
private String filename = "ModelInfo.txt";
UnitModelParser parser = new UnitModelParser();
public List<Gps> coordinate = new ArrayList<Gps>();
private String fName;
GpsXmlParser gpsParser = new GpsXmlParser();
ArrayList<Gps> coorList = gpsParser.getItemsList();
String TAG = "Test";
private static final String FOLDER_PATH = Environment.getExternalStorageDirectory() + "/Gps/";
File dir = new File (FOLDER_PATH);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new LoadModelTask().execute();
Button btnModel = (Button) findViewById(R.id.btnModel);
btnModel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// write on SD card file data in the text box
if (isWritable()) {
ArrayList<UnitModel> modelList = parser.getItemsList();
UnitModel modd = modelList.get(0);
StringBuilder locationStrBuilder = new StringBuilder();
locationStrBuilder.append(modd);
String locationStrModel = locationStrBuilder.toString();
fName = locationStrModel + ".txt";
try {
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File(sdCard.getAbsolutePath()+"/GpsOutput");
directory.mkdirs();
File myFile = new File(directory, filename);
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile, true);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(locationStrModel + "/n");
myOutWriter.close();
fOut.close();
Toast.makeText(getBaseContext(),"Successfully acquired the unit information.",Toast.LENGTH_SHORT).show();
System.out.println("Model ID : " + locationStrModel);
}
catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
else
{
Toast.makeText(getBaseContext(),"SD Card Not Available",Toast.LENGTH_SHORT).show();
}
}
});
new LoadGpsTask().execute();
Button btnGps = (Button) findViewById(R.id.btnGps);
btnGps.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
StringBuilder locationStrBuilder = new StringBuilder();
int s = 0;
for (Gps c : coordinate)
{
locationStrBuilder.append(c.toString());
System.out.println(++s + c.toString());
}
if (isWritable()) {
try {
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File(sdCard.getAbsolutePath()+"/GpsOutput");
directory.mkdirs();
File myFile = new File(directory, fName);
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile, false);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(locationStrBuilder);
myOutWriter.close();
fOut.close();
Toast.makeText(getBaseContext(),"Successfully downloaded gps coordinate.",Toast.LENGTH_SHORT).show();
}
catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
} }
else
{
Toast.makeText(getBaseContext(),"SD Card Not Available",Toast.LENGTH_SHORT).show();
}
}
});
}// onCreate
private class LoadModelTask extends AsyncTask<String, Void, List<UnitModel>> {
@Override
protected List<UnitModel> doInBackground(String... args) {
// CALL XMLPULLPARSER & RETURN A LIST
model = parser.parse(getBaseContext());
return model;
}
}
//filenamefilter method
public FilenameFilter xmlFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".xml") || name.endsWith(".XML");
}
};
private class LoadGpsTask extends AsyncTask<String, Void, List<Gps>> {
@Override
protected List<Gps> doInBackground(String... args) {
// CALL XMLPULLPARSER & RETURN A LIST
String files[] = dir.list(xmlFilter);
for (String filename : files) {
String path = dir.getAbsolutePath() + "/" + filename;
Log.i(TAG, path);
System.out.println("PARSING : " + path);
coordinate.addAll(gpsParser.parse(path));
Log.i(TAG,"message");
Log.i(TAG,coordinate.size() + "");
}
Log.i(TAG,coordinate.size() + "");
return coordinate;
}
}
public boolean isWritable() {
String status = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(status))
{
return true;
}
return false;
} //isWritable
}
Y esta es la salida de Logcat:
05-15 14:03:35.016: E/AndroidRuntime(2942): FATAL EXCEPTION: AsyncTask #2
05-15 14:03:35.016: E/AndroidRuntime(2942): java.lang.RuntimeException: An error occured while executing doInBackground()
05-15 14:03:35.016: E/AndroidRuntime(2942): at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-15 14:03:35.016: E/AndroidRuntime(2942): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-15 14:03:35.016: E/AndroidRuntime(2942): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-15 14:03:35.016: E/AndroidRuntime(2942): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-15 14:03:35.016: E/AndroidRuntime(2942): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-15 14:03:35.016: E/AndroidRuntime(2942): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-15 14:03:35.016: E/AndroidRuntime(2942): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-15 14:03:35.016: E/AndroidRuntime(2942): at java.lang.Thread.run(Thread.java:838)
05-15 14:03:35.016: E/AndroidRuntime(2942): Caused by: java.lang.NullPointerException
05-15 14:03:35.016: E/AndroidRuntime(2942): at asp.xmlreader.MainActivity$LoadGpsTask.doInBackground(MainActivity.java:152)
05-15 14:03:35.016: E/AndroidRuntime(2942): at asp.xmlreader.MainActivity$LoadGpsTask.doInBackground(MainActivity.java:1)
05-15 14:03:35.016: E/AndroidRuntime(2942): at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-15 14:03:35.016: E/AndroidRuntime(2942): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-15 14:03:35.016: E/AndroidRuntime(2942): ... 4 more
05-15 14:03:35.041: V/InputMethodManager(2942): onWindowFocus: null softInputMode=288 first=true flags=#1810100
05-15 14:03:35.042: V/InputMethodManager(2942): START INPUT: com.android.internal.policy.impl.PhoneWindow$DecorView{41377878 V.E..... R.....ID 0,0-768,976} ic=null tba=android.view.inputmethod.EditorInfo@413a1d28 controlFlags=#104
05-15 14:03:35.044: V/InputMethodManager(2942): Starting input: Bind result=InputBindResult{com.android.internal.view.IInputMethodSession$Stub$Proxy@413a2678 com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME #16}
05-15 14:03:36.076: D/OpenGLRenderer(2942): Flushing caches (mode 0)
05-15 14:03:36.174: D/OpenGLRenderer(2942): Flushing caches (mode 0)
05-15 14:03:36.178: D/OpenGLRenderer(2942): Flushing caches (mode 1)
05-15 14:03:36.183: D/OpenGLRenderer(2942): Flushing caches (mode 0)
05-15 14:03:38.085: I/Process(2942): Sending signal. PID: 2942 SIG: 9
¿Alguien puede decirme por qué sucede esto? Gracias por no criticar ya que soy nuevo en esto.
tal vez necesites crear la carpeta en el nuevo dispositivo
private static final String FOLDER_PATH = Environment.getExternalStorageDirectory () + "/ Gps /";
Archivo dir = new File (FOLDER_PATH);
private class LoadGpsTask extends AsyncTask<String, Void, List<Gps>> {
@Override
protected List<Gps> doInBackground(String... args) {
//create folder if not exist
boolean success = true;
if (!dir.exists()) {
success = dir.mkdir();
}
if (!success) {
// Do something else on failure
}
// CALL XMLPULLPARSER & RETURN A LIST
String files[] = dir.list(xmlFilter);