Java 如何解决设备开机时应用程序强制关闭的问题?

Java 如何解决设备开机时应用程序强制关闭的问题?,java,android,android-viewpager,gallery,Java,Android,Android Viewpager,Gallery,我开发了简单的android imageview,它使用viewpager,在后台播放音乐。当到达最后一个图像时,它还会停止音乐,当用户滑回图像时,它会恢复音乐。然而,我的主要问题是,当设备进入睡眠状态时,音乐停止,当设备再次启动时,而不是再次恢复音乐并显示图像..它强制关闭。。。关于如何解决此问题的任何建议…以下是我的代码 Mainactivity.java import android.app.Activity; import android.content.Intent; import a

我开发了简单的android imageview,它使用viewpager,在后台播放音乐。当到达最后一个图像时,它还会停止音乐,当用户滑回图像时,它会恢复音乐。然而,我的主要问题是,当设备进入睡眠状态时,音乐停止,当设备再次启动时,而不是再次恢复音乐并显示图像..它强制关闭。。。关于如何解决此问题的任何建议…以下是我的代码

Mainactivity.java

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;

import android.view.MenuItem;
import android.widget.ShareActionProvider;

public class MainActivity extends Activity {

        MediaPlayer oursong;

        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        oursong = MediaPlayer.create(MainActivity.this, R.raw.a);
        oursong.seekTo(0);
         oursong.start();
        ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
        final ImageAdapter adapter = new ImageAdapter(this);
         viewPager.setAdapter(adapter);
         viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int pos) {
            if (pos == adapter.getCount() - 1)

             {
              oursong.pause();

               } else if (!oursong.isPlaying()) 

                                        { 
                oursong.start();

               }         
               }

               @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
              // TODO Auto-generated method stub

                 }

                 @Override
                 public void onPageScrollStateChanged(int arg0) {
                 // TODO Auto-generated method stub

                  }
                 });
        }

        private ShareActionProvider mShareActionProvider;

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate menu resource file.
                getMenuInflater().inflate(R.menu.activity_main, menu);

                // Locate MenuItem with ShareActionProvider
                MenuItem item = menu.findItem(R.id.menu_item_share);

                // Fetch and store ShareActionProvider
                mShareActionProvider = (ShareActionProvider) item.getActionProvider();
                // Return true to display menu
                return true;
        }

        // Call to update the share intent
        private void setShareIntent(Intent shareIntent) {
                if (mShareActionProvider != null) {
                        mShareActionProvider.setShareIntent(shareIntent);
                }
        }

        @Override
        protected void onPause() {
                super.onPause();
                oursong.release();
        }
}
ImageAdapter.java

import java.io.IOException;

import android.app.WallpaperManager;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class ImageAdapter extends PagerAdapter {
    Context context;
    private final int[] GalImages = new int[] {
        R.drawable.one,
        R.drawable.two,
        R.drawable.three
    };    
    ImageAdapter(Context context){
        this.context=context;
    }
    @Override
    public int getCount() {
      return GalImages.length;
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
      return view == ((ImageView) object);
    }
    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
      ImageView imageView = new ImageView(context);
      int padding = context.getResources().getDimensionPixelSize(R.dimen.padding_small);
      imageView.setPadding(padding, padding, padding, padding);
      imageView.setScaleType(ImageView.ScaleType.FIT_XY);
      imageView.setImageResource(GalImages[position]);  
      imageView.setOnClickListener(new View.OnClickListener() {

           public void onClick(View view) {

                    WallpaperManager myWallpaperManager  = WallpaperManager.getInstance(context);
                    try {
                            myWallpaperManager.setResource(GalImages[position]);
                    } catch (IOException e) {
                             // TODO Auto-generated catch block
                             e.printStackTrace();
                    }      
           }
           });
      ((ViewPager) container).addView(imageView, 0);
      return imageView;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
      ((ViewPager) container).removeView((ImageView) object);
    }
  }
Logcat错误。。。。(当应用程序在实际设备上运行时,记录了以下日志)


您是否尝试过将音乐播放移动到onResume()活动中?在创建活动之前,带有片段的活动生命周期不会再次调用onCreate()。因此,如果不关闭应用程序,播放将无法恢复

像这样的

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;

import android.view.MenuItem;
import android.widget.ShareActionProvider;

public class MainActivity extends Activity {

    MediaPlayer oursong;
    ViewPager viewPager;
    ImageAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         oursong = MediaPlayer.create(MainActivity.this, R.raw.a);
         oursong.seekTo(0);
         oursong.start();

         viewPager = (ViewPager) findViewById(R.id.view_pager);
         adapter = new ImageAdapter(this);
         viewPager.setAdapter(adapter);


         viewPager.setOnPageChangeListener(MyViewPagerListener);
    }

    private ShareActionProvider mShareActionProvider;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate menu resource file.
            getMenuInflater().inflate(R.menu.activity_main, menu);

            // Locate MenuItem with ShareActionProvider
            MenuItem item = menu.findItem(R.id.menu_item_share);

            // Fetch and store ShareActionProvider
            mShareActionProvider = (ShareActionProvider) item.getActionProvider();
            // Return true to display menu
            return true;
    }

    // Call to update the share intent
    private void setShareIntent(Intent shareIntent) {
            if (mShareActionProvider != null) {
                    mShareActionProvider.setShareIntent(shareIntent);
            }
    }

    @Override
    protected void onPause() {
            super.onPause();

           if(oursong != null){
               oursong.release();
            }
    }

    @Override
    protected void onResume(){
          super.onResume();

         /*
          * This is the important part, basically since your releasing the song
          * in onPause() you are getting rid of its reference, in this case check
          * if your song is null then if it is re-create it, else you can reuse the
          * the original, but i suspect that calling release() in onPause() allows the
          * song to get cleaned up by Java's Garbage Collector.
          */
         if(oursong == null){
            oursong = MediaPlayer.create(MainActivity.this, R.raw.a);
            oursong.seekTo(0); // You will probably want to save an int to restore here
            oursong.start();
         }else{
            oursong.seekTo();
            oursong.start();
         }

    }

   /*
    * May want to add two methods here: onSaveInstanceState(Bundle outstate) &
    * onRestoreInstanceState(Bundle savedInstanceState) to maintain playback position
    * in onResume instead of just restarting the song.
    */

   private final OnPageChangeListener MyViewPagerListener = new OnPageChangeListener() {

            @Override
            public void onPageSelected(int pos) {
              if (pos == adapter.getCount() - 1){
                 // adding null checks for safety
                 if(oursong != null){
                    oursong.pause();
                 }

               } else if (!oursong.isPlaying()){ 

                // adding null check for safety
                if(oursong != null){
                    oursong.start();
                }
              }         
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
             // TODO Auto-generated method stub

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

            }
        };

 }

希望这有助于您解决问题。

您能发布日志猫吗?@113408…抱歉..我无法发布日志猫..我的模拟器有问题…@113408…今天终于让我的模拟器工作了…请查看上面的日志猫错误…此日志猫与您所说的遇到的问题无关这是在谈论拉丁语字典无法打开,您是否有第三方库依赖关系?@internal\u class7…否…请让我重新启动模拟器。@internal\u class7…对不起。。。但我对安卓系统还不熟悉。这会很有帮助。。如果你详细解释的话..就像在这里和那里移动这个代码..谢谢你的回复..很抱歉这么简短的解释我会在早上为你发布一些代码。但它的缺点是使用活动文件中右键单击的override/implement选项覆盖onResume。然后从向导中选择onResume()。并将媒体播放实例移动到onResume中,这样当活动恢复@Internal_class7时,您就不会得到空指针和播放恢复…再次感谢..如果您将其发布到pastebin..或此处..@Internal_class7..我得到的是带红十字的黄色灯泡。。在这段代码附近是oursong.seekTo();它说“类型媒体播放器中的方法SeekTo(Int)不适用于参数”@internal_class7…我试图这样替换我们的歌曲。SeekTo(0)。。。。。。但这并没有解决我的问题:(
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;

import android.view.MenuItem;
import android.widget.ShareActionProvider;

public class MainActivity extends Activity {

    MediaPlayer oursong;
    ViewPager viewPager;
    ImageAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         oursong = MediaPlayer.create(MainActivity.this, R.raw.a);
         oursong.seekTo(0);
         oursong.start();

         viewPager = (ViewPager) findViewById(R.id.view_pager);
         adapter = new ImageAdapter(this);
         viewPager.setAdapter(adapter);


         viewPager.setOnPageChangeListener(MyViewPagerListener);
    }

    private ShareActionProvider mShareActionProvider;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate menu resource file.
            getMenuInflater().inflate(R.menu.activity_main, menu);

            // Locate MenuItem with ShareActionProvider
            MenuItem item = menu.findItem(R.id.menu_item_share);

            // Fetch and store ShareActionProvider
            mShareActionProvider = (ShareActionProvider) item.getActionProvider();
            // Return true to display menu
            return true;
    }

    // Call to update the share intent
    private void setShareIntent(Intent shareIntent) {
            if (mShareActionProvider != null) {
                    mShareActionProvider.setShareIntent(shareIntent);
            }
    }

    @Override
    protected void onPause() {
            super.onPause();

           if(oursong != null){
               oursong.release();
            }
    }

    @Override
    protected void onResume(){
          super.onResume();

         /*
          * This is the important part, basically since your releasing the song
          * in onPause() you are getting rid of its reference, in this case check
          * if your song is null then if it is re-create it, else you can reuse the
          * the original, but i suspect that calling release() in onPause() allows the
          * song to get cleaned up by Java's Garbage Collector.
          */
         if(oursong == null){
            oursong = MediaPlayer.create(MainActivity.this, R.raw.a);
            oursong.seekTo(0); // You will probably want to save an int to restore here
            oursong.start();
         }else{
            oursong.seekTo();
            oursong.start();
         }

    }

   /*
    * May want to add two methods here: onSaveInstanceState(Bundle outstate) &
    * onRestoreInstanceState(Bundle savedInstanceState) to maintain playback position
    * in onResume instead of just restarting the song.
    */

   private final OnPageChangeListener MyViewPagerListener = new OnPageChangeListener() {

            @Override
            public void onPageSelected(int pos) {
              if (pos == adapter.getCount() - 1){
                 // adding null checks for safety
                 if(oursong != null){
                    oursong.pause();
                 }

               } else if (!oursong.isPlaying()){ 

                // adding null check for safety
                if(oursong != null){
                    oursong.start();
                }
              }         
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
             // TODO Auto-generated method stub

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

            }
        };

 }