Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序在首次运行API 26时崩溃_Java_Android_Database - Fatal编程技术网

Java 应用程序在首次运行API 26时崩溃

Java 应用程序在首次运行API 26时崩溃,java,android,database,Java,Android,Database,我在assets文件夹中创建了一个带有数据库的应用程序。我写了一个代码将数据库复制到sdcard,当然对于android 6+来说,它需要运行时权限。我的问题是:应用程序在请求权限之前复制数据库,所以第一次应用程序崩溃,但权限窗口在屏幕上,若你们在第二次运行时允许,那个么应用程序就像魅力一样工作。请帮我解决这个问题 这是我的密码: package farmani.com.essentialwordsforielts.mainPage; import android.Manifest; impo

我在assets文件夹中创建了一个带有数据库的应用程序。我写了一个代码将数据库复制到sdcard,当然对于android 6+来说,它需要运行时权限。我的问题是:应用程序在请求权限之前复制数据库,所以第一次应用程序崩溃,但权限窗口在屏幕上,若你们在第二次运行时允许,那个么应用程序就像魅力一样工作。请帮我解决这个问题

这是我的密码:

package farmani.com.essentialwordsforielts.mainPage;

import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import farmani.com.essentialwordsforielts.R;

public class MainActivity extends AppCompatActivity  {

public static Context context;
DrawerLayout drawerLayout;
NavigationView navigationView;
ImageView hamburger;
SQLiteDatabase database;
String destPath;

public static ArrayList<Structure> list = new ArrayList<Structure>();
public static ArrayList<Structure> favorite = new ArrayList<Structure>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.navigation_activity_main);

    if(Build.VERSION.SDK_INT >= 23){


        if(ContextCompat.checkSelfPermission(MainActivity.this, 
Manifest.permission.READ_EXTERNAL_STORAGE) != 
PackageManager.PERMISSION_GRANTED){

            ActivityCompat.requestPermissions(MainActivity.this
                    , new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
                            ,Manifest.permission.WRITE_EXTERNAL_STORAGE}
                    , 1);

        }else if(ContextCompat.checkSelfPermission(MainActivity.this, 
Manifest.permission.WRITE_EXTERNAL_STORAGE) != 
PackageManager.PERMISSION_GRANTED){

            ActivityCompat.requestPermissions(MainActivity.this
                    , new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
                            ,Manifest.permission.WRITE_EXTERNAL_STORAGE}
                    , 1);

        }else {

            Toast.makeText(MainActivity.this,"You grandet 
earlier",Toast.LENGTH_LONG).show();

        }


    }





    try {
        destPath = 
Environment.getExternalStorageDirectory().getAbsolutePath() + "/ielts/";
        File file = new File(destPath);
        if (!file.exists()) {
            file.mkdirs();
            file.createNewFile();
            CopyDB(getBaseContext().getAssets().open("md_book.db"),
                    new FileOutputStream(destPath + "/md_book.db"));
        }
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    context = getApplicationContext();
    setTabOption();

    drawerLayout = findViewById(R.id.navigation_drawer);
    navigationView = findViewById(R.id.navigation_view);
    hamburger = findViewById(R.id.hamburger);
    hamburger.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            drawerLayout.openDrawer(Gravity.START);
        }
    });




    navigationView.setNavigationItemSelectedListener(new 
NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.exit) {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                        MainActivity.this);

                alertDialog.setTitle(R.string.exit);

                alertDialog.setMessage(R.string.exit_ask);
                alertDialog.setCancelable(false);

                alertDialog.setPositiveButton(R.string.yes,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int 
which) {
                                finish();
                            }
                        });

                alertDialog.setNegativeButton(R.string.no,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int 
which) {

                                dialog.cancel();
                            }
                        });

                alertDialog.show();
            }

            return true;
        }
    });

    selectList();
    selectFavorite();


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
permissions, @NonNull int[] grantResults) {

    switch (requestCode) {
        case 1: {

            if (grantResults.length >= 2 && grantResults[0] == 
PackageManager.PERMISSION_GRANTED && grantResults[1] == 
PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(MainActivity.this, "Access granted", 
Toast.LENGTH_LONG).show();

            }

        }
    }
}


@Override
public void onBackPressed() {
    if (drawerLayout.isDrawerOpen(Gravity.START)) {
        drawerLayout.closeDrawer(Gravity.START);
    } else {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                MainActivity.this);

        alertDialog.setTitle(R.string.exit);

        alertDialog.setMessage(R.string.exit_ask);
        alertDialog.setCancelable(false);

        alertDialog.setPositiveButton(R.string.yes,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });

        alertDialog.setNegativeButton(R.string.no,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.cancel();
                    }
                });

        alertDialog.show();
    }
}


private void setTabOption() {
    ViewPager viewPager = findViewById(R.id.viewpager);
    viewPager.setAdapter(new AdapterFragment(getSupportFragmentManager(), 
context));
    TabLayout tabStrip = findViewById(R.id.tabs);
    tabStrip.setupWithViewPager(viewPager);
}

private void CopyDB(InputStream inputStream, OutputStream outputStream) 
throws IOException {
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) > 0) {
        outputStream.write(buffer, 0, length);
    }
    inputStream.close();
    outputStream.close();
}

private void selectFavorite(){

    database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db", 
null);
    Cursor cursor = database.rawQuery("SELECT * FROM main WHERE fav = 1", 
null);
    while (cursor.moveToNext()){
        String word = cursor.getString(cursor.getColumnIndex("word"));
        String definition = 
cursor.getString(cursor.getColumnIndex("definition"));
        String trans = cursor.getString(cursor.getColumnIndex("trans"));
        String img = cursor.getString(cursor.getColumnIndex("img"));
        int id = cursor.getInt(cursor.getColumnIndex("id"));

        Structure struct = new Structure(word, definition, trans, img, id);
        struct.setWord(word);
        struct.setDefinition(definition);
        struct.setTrans(trans);
        struct.setImg(img);
        struct.setId(id);
        favorite.add(struct);
    }

}

private void selectList(){

    database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db", 
null);
    Cursor cursor = database.rawQuery("SELECT * FROM main", null);
    while (cursor.moveToNext()){
        String word = cursor.getString(cursor.getColumnIndex("word"));
        String definition = 
cursor.getString(cursor.getColumnIndex("definition"));
        String trans = cursor.getString(cursor.getColumnIndex("trans"));
        String img = cursor.getString(cursor.getColumnIndex("img"));
        int id = cursor.getInt(cursor.getColumnIndex("id"));

        Structure struct = new Structure(word, definition, trans, img, id);
        struct.setWord(word);
        struct.setDefinition(definition);
        struct.setTrans(trans);
        struct.setImg(img);
        struct.setId(id);
        list.add(struct);
    }

    }

}

这很简单。将复制数据库代码移动到已授予的权限中。如果您在获得许可之前在onCreate中执行此操作,您将崩溃。运气的赌注

包farmani.com.essentialwordsforiets.mainPage

        import android.Manifest;
        import android.content.Context;
        import android.content.DialogInterface;
        import android.content.pm.PackageManager;
        import android.database.Cursor;
        import android.database.sqlite.SQLiteDatabase;
        import android.os.Build;
        import android.os.Environment;
        import android.support.annotation.NonNull;
        import android.support.design.widget.NavigationView;
        import android.support.design.widget.TabLayout;
        import android.support.v4.app.ActivityCompat;
        import android.support.v4.content.ContextCompat;
        import android.support.v4.view.ViewPager;
        import android.support.v4.widget.DrawerLayout;
        import android.support.v7.app.AlertDialog;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.view.Gravity;
        import android.view.MenuItem;
        import android.view.View;
        import android.widget.ImageView;
        import android.widget.Toast;
        import java.io.File;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.OutputStream;
        import java.util.ArrayList;
        import farmani.com.essentialwordsforielts.R;

public class MainActivity extends AppCompatActivity {

    public static Context context;
    DrawerLayout drawerLayout;
    NavigationView navigationView;
    ImageView hamburger;
    SQLiteDatabase database;
    String destPath;

    public static ArrayList<Structure> list = new ArrayList<Structure>();
    public static ArrayList<Structure> favorite = new ArrayList<Structure>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.navigation_activity_main);

        if(Build.VERSION.SDK_INT >= 23){


            if(ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.READ_EXTERNAL_STORAGE) !=
                    PackageManager.PERMISSION_GRANTED){

                ActivityCompat.requestPermissions(MainActivity.this
                        , new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
                                ,Manifest.permission.WRITE_EXTERNAL_STORAGE}
                        , 1);

            }else if(ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
                    PackageManager.PERMISSION_GRANTED){

                ActivityCompat.requestPermissions(MainActivity.this
                        , new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
                                ,Manifest.permission.WRITE_EXTERNAL_STORAGE}
                        , 1);

            }else {

                Toast.makeText(MainActivity.this,"You grandet 
                        earlier",Toast.LENGTH_LONG).show();

            }


        }

        context = getApplicationContext();
        setTabOption();

        drawerLayout = findViewById(R.id.navigation_drawer);
        navigationView = findViewById(R.id.navigation_view);
        hamburger = findViewById(R.id.hamburger);
        hamburger.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                drawerLayout.openDrawer(Gravity.START);
            }
        });







    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1: {

                if (grantResults.length >= 2 && grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED && grantResults[1] ==
                        PackageManager.PERMISSION_GRANTED) {

                   setupDB();
                   setupNavDrawer();

                    Toast.makeText(MainActivity.this, "Access granted",
                            Toast.LENGTH_LONG).show();

                }

            }
        }
    }


    @Override
    public void onBackPressed() {
        if (drawerLayout.isDrawerOpen(Gravity.START)) {
            drawerLayout.closeDrawer(Gravity.START);
        } else {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                    MainActivity.this);

            alertDialog.setTitle(R.string.exit);

            alertDialog.setMessage(R.string.exit_ask);
            alertDialog.setCancelable(false);

            alertDialog.setPositiveButton(R.string.yes,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    });

            alertDialog.setNegativeButton(R.string.no,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            dialog.cancel();
                        }
                    });

            alertDialog.show();
        }
    }


    private void setTabOption() {
        ViewPager viewPager = findViewById(R.id.viewpager);
        viewPager.setAdapter(new AdapterFragment(getSupportFragmentManager(),
                context));
        TabLayout tabStrip = findViewById(R.id.tabs);
        tabStrip.setupWithViewPager(viewPager);
    }

    private void setupDB(){
        try {
            destPath =
                    Environment.getExternalStorageDirectory().getAbsolutePath() + "/ielts/";
            File file = new File(destPath);
            if (!file.exists()) {
                file.mkdirs();
                file.createNewFile();
                CopyDB(getBaseContext().getAssets().open("md_book.db"),
                        new FileOutputStream(destPath + "/md_book.db"));
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
    private void setupNavDrawer(){
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                int id = item.getItemId();
                if (id == R.id.exit) {
                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                            MainActivity.this);

                    alertDialog.setTitle(R.string.exit);

                    alertDialog.setMessage(R.string.exit_ask);
                    alertDialog.setCancelable(false);

                    alertDialog.setPositiveButton(R.string.yes,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int
                                        which) {
                                    finish();
                                }
                            });

                    alertDialog.setNegativeButton(R.string.no,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int
                                        which) {

                                    dialog.cancel();
                                }
                            });

                    alertDialog.show();
                }

                return true;
            }
        });

        selectList();
        selectFavorite();
    }

    private void CopyDB(InputStream inputStream, OutputStream outputStream)
            throws IOException {
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
        inputStream.close();
        outputStream.close();
    }

    private void selectFavorite(){

        database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db",
                null);
        Cursor cursor = database.rawQuery("SELECT * FROM main WHERE fav = 1",
                null);
        while (cursor.moveToNext()){
            String word = cursor.getString(cursor.getColumnIndex("word"));
            String definition =
                    cursor.getString(cursor.getColumnIndex("definition"));
            String trans = cursor.getString(cursor.getColumnIndex("trans"));
            String img = cursor.getString(cursor.getColumnIndex("img"));
            int id = cursor.getInt(cursor.getColumnIndex("id"));

            Structure struct = new Structure(word, definition, trans, img, id);
            struct.setWord(word);
            struct.setDefinition(definition);
            struct.setTrans(trans);
            struct.setImg(img);
            struct.setId(id);
            favorite.add(struct);
        }

    }

    private void selectList(){

        database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db",
                null);
        Cursor cursor = database.rawQuery("SELECT * FROM main", null);
        while (cursor.moveToNext()){
            String word = cursor.getString(cursor.getColumnIndex("word"));
            String definition =
                    cursor.getString(cursor.getColumnIndex("definition"));
            String trans = cursor.getString(cursor.getColumnIndex("trans"));
            String img = cursor.getString(cursor.getColumnIndex("img"));
            int id = cursor.getInt(cursor.getColumnIndex("id"));

            Structure struct = new Structure(word, definition, trans, img, id);
            struct.setWord(word);
            struct.setDefinition(definition);
            struct.setTrans(trans);
            struct.setImg(img);
            struct.setId(id);
            list.add(struct);
        }

    }

}

从阅读一些关于如何追踪事故原因的提示开始。我知道事故原因。它尝试在授予权限之前复制数据库。我试图先获取权限,然后在if子句中复制数据库,但这并没有帮助。请求权限是异步的。这意味着调用不会阻塞,您的代码将复制数据库,如您所见。阅读有关如何正确响应授予或拒绝的权限的说明。您是否阅读了我的代码?我用了同样的方法。但我还是遇到了问题。哪行代码导致了崩溃?我尝试使用CopyDB;在我的代码中,但实际上我的方法是CopyDBInputStream inputStream,OutputStream OutputStream,它给出了错误。在这里,我将您的nav和db设置移动到方法,并从授予权限的回调调用。尝试一下,看看你是否被清除,直到你确定你已经处理了权限和访问它的正确顺序,我会集中在这一部分。在尝试移动之前,一旦您确定您拥有权限,如果您仍然有错误,那么我将帮助您解决下一个错误。我不知道如何感谢您,先生。我第一次跑步时撞车的问题解决了。现在,在第一次运行时,它不加载数据库崩溃消失了。唯一的问题是数据库。现在它不显示了