2015-08-22 3 views
0

Я работаю над приложением, которое выполняет функцию, когда я встряхиваю телефон. Для этого я создал класс ShakeListener. Мое приложение работает так же, как и его, когда я его открываю. Когда я открываю приложение и нажимаю кнопку «Назад» и перехожу на главный экран и встряхиваю телефон, он включает вспышку (как и предполагалось), но когда я снова открываю приложение, он падает. Я не знаю, почему это происходитBitmapDrawable не может быть добавлен в AnimationDrawable

Моя основная деятельность

public class MainActivity extends ActionBarActivity { 
@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
     super.onResume(); 
     SharedPreferences getprefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
     boolean stopshake = getprefs.getBoolean("checkbox", true); 
     if (stopshake) { 
      mShaker = new ShakeListener(this); 
      mShaker.setOnShakeListener(new ShakeListener.OnShakeListener() { 
       public void onShake() { 
        if (!isFlashOn && mShaker != null) { 

         getCamera(); 
         turnOnFlash(); 
        } else { 
         turnOffFlash(); 

        } 
       } 
      }); 
     } else { 
      if (mShaker != null) { 
       mShaker.setOnShakeListener(null); 
       mShaker = null; 
      } 
     }  
} 

private ToggleButton togle; 
private Camera camera; 
    private boolean isFlashOn; 

    private boolean hasFlash; 
    Parameters params; 
    private ShakeListener mShaker; 
    MediaPlayer mp; 
    ImageView anime; 
    int p=1; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    anime = (ImageView) findViewById(R.id.Animation); 

    hasFlash = getApplicationContext().getPackageManager() 
      .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

    if (!hasFlash) { 
     // device doesn't support flash 
     // Show alert message and close the application 
     AlertDialog alert = new AlertDialog.Builder(MainActivity.this) 
       .create(); 
     alert.setTitle("Error"); 
     alert.setMessage("Sorry, your device doesn't support flash light!"); 
     alert.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // closing the application 
       finish(); } 
     }); 
     alert.show(); 
     return;} 


    getCamera(); 


    togle = (ToggleButton) findViewById(R.id.ToggleButton01); 

    togle.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     // TODO Auto-generated method stub 
       boolean checked = ((ToggleButton) v).isChecked(); 
       if (checked){ 
        turnOffFlash(); 
       } 

       else{ 
        getCamera(); 
        turnOnFlash(); 
       } 
        } 
     }); 


    } 

private void getCamera() { 
    // TODO Auto-generated method stub 
    if (camera == null) { 
     try { 
      camera = Camera.open(); 
      params = camera.getParameters(); 
     } catch (RuntimeException e) { 
      Log.e("Camera Error. Failed to Open. Error: ", e.getMessage()); 
     } 
    } } 

private void turnOnFlash() { 
    if (!isFlashOn) { 
     if (camera == null || params == null) { 
      return; 
     } 
     // play sound 
     getCamera(); 
     playSound(); 

     params = camera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(params); 
     camera.startPreview(); 
     isFlashOn = true; 
     anime.setImageResource(R.drawable.anim); 
     anime.post(new Runnable() { 
      @Override 
      public void run() { 
       AnimationDrawable frameAnimation = 
        (AnimationDrawable) anime.getDrawable(); 
       frameAnimation.start(); 
      } 
     }); 

     // changing button/switch image 
    } 
    } 

private void turnOffFlash() { 
     if (isFlashOn) { 
      if (camera == null || params == null) { 
       return; 
      } 
      // play sound 
      playSound(); 

      params = camera.getParameters(); 
      params.setFlashMode(Parameters.FLASH_MODE_OFF); 
      camera.setParameters(params); 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release(); 
      camera = null; 
      isFlashOn = false; 
      anime.setImageResource(R.drawable.off); 
      // changing button/switch image 
     } 
    } 

private void playSound() { 
    // TODO Auto-generated method stub 
    if(isFlashOn){ 
      mp = MediaPlayer.create(MainActivity.this, R.raw.off1); 
     }else{ 
      mp = MediaPlayer.create(MainActivity.this, R.raw.on1); 
     } 
     mp.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       // TODO Auto-generated method stub 
       mp.release(); 
      } 
     }); 
     mp.start(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    super.onOptionsItemSelected(item); 
    switch(item.getItemId()){ 
    case R.id.action_settings: 
     Intent intent = new Intent(MainActivity.this, Prefsetting.class); 
     startActivity(intent); 
     break; 

    case R.id.about: 
     AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); 
     dlgAlert.setMessage("This is an alert with no consequence"); 
     dlgAlert.setTitle("App Title"); 
     dlgAlert.setPositiveButton("OK", null); 
     dlgAlert.setCancelable(true); 
     dlgAlert.create().show(); 
     break; 

} 
return true; 


} 
     } 

Мой LogCat показывает

08-23 04: 31: 53.205: D/ShakeListener (11990): ShakeListener invused ----> 08-23 04: 31: 53.207: D/ShakeListener (11990): ShakeListener setOnShakeListener invused ----> 08-23 04: 31: 53.312: D/AndroidRuntime (11990): выключение VM 08-23 04: 31: 53.314: E/AndroidRuntime (11990): FATAL EXCEPTION: main 08-23 04: 31: 53.314: E/AndroidRuntime (11990): Процесс: com.shakylight, PID: 11990 08-23 04: 31: 53.314: E/AndroidRuntime (11990): java.lang.ClassCastException: android .graphics.drawable.BitmapDrawable не может быть добавлен в android.graphics.drawable.AnimationDrawable 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at com.shakylight.MainActivity $ 4.run (MainActivity.java:145) 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at android.os.Handler.handleCallback (Handler.java:739) 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at android.os.Handler.dispatchMessage (Handler.java:95) 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at android.os.Looper.loop (Looper.java:135) 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at android.app.ActivityThread.main (ActivityThread.java:5254) 08-23 04:31: 53.314: E/AndroidRuntime (11990): at java.lang.reflect.Method.invoke (собственный метод) 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at java.lang.reflect.Method.invoke (Method.java:372) 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:903) 08-23 04 : 31: 53,314: E/AndroidRuntime (11990): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698)

+0

Hello! Пожалуйста, разместите короткую версию своего кода и прочитайте раздел о том, как задать вопрос. – LBes

+1

А я сделал, но я боюсь, что эта проблема требует, чтобы я показал полный код. Я думаю, что у моего титула может не хватить точности, за которую я извиняюсь, но просто не мог выйти с лучшим – Blacklotis

+0

Ошибка здесь, по-видимому: E/AndroidRuntime (11990): java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable не может быть перенесена в android.graphics.drawable.AnimationDrawable 08-23 04: 31: 53.314: E/AndroidRuntime (11990): at com.shakylight.MainActivity $ 4.run (MainActivity.java:145). Не могу прочитать весь код на своем телефоне. – LBes

ответ

1

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не могу проверить, что я советую вам попробовать здесь, но это может сработать нормально. В любом случае, вы можете сообщить мне в комментариях.

Так что ошибка исходит от этой линии:

AnimationDrawable frameAnimation = (AnimationDrawable) anime.getDrawable(); 

Я не эксперт и документация не поможет.Android пример документация следующее: (см здесь: http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html)

AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); 

Однако тщательный поиск по SO (здесь = "Class Cast Exception" when trying to set image frames to background) дал мне это, когда решение, по-видимому, чтобы сделать следующее (вопреки логике документация):

Drawable drawable = getResources().getDrawable(R.drawable.<your_animation_xml_file_name>) 
+0

Да, это то, что он дает мне ошибку «res» из Drawable drawable = res.getDrawable (R.drawable. ), по-видимому, он не может ее решить и обнаружить это как папка – Blacklotis

+0

Действительно ли вы заменили «» на фактическое имя вашего файла анимации xml? – LBes

+0

Да, я заменил его на Drawable drawable = res.getDrawable (R.drawable.anim); – Blacklotis

3

Проблема, кажется, приходит на следующую строку, когда вы литье:

AnimationDrawable frameAnimation = (AnimationDrawable) anime.getDrawable(); 

Вы используете anime.setImageResource() по телефону ImageView, чтобы установить ваш номер. Вместо этого попробуйте использовать anime.setImageDrawable(getResource().getDrawable(R.drawable. anim); и проверьте, сохраняется ли ошибка.

+0

По-прежнему ничего хорошего, он падает, когда я открываю его снова – Blacklotis

+0

Возможно, логарифм отличается. Просто сказать, что он все еще разбился, недостаточно. Напротив, это кажется логичным для меня. @Blacklotis проверить мой ответ, тогда это может помочь вам – LBes

Смежные вопросы