RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 760568
Accepted
Вячеслав
Вячеслав
Asked:2020-12-19 23:45:26 +0000 UTC2020-12-19 23:45:26 +0000 UTC 2020-12-19 23:45:26 +0000 UTC

获得权限后切换到另一个活动

  • 772

当应用程序启动时,我们会显示启动屏幕,并且还会请求读取/写入 SD 卡的权限。从开始的活动开始,2 秒后,有一个过渡到另一个活动。用户没有时间阅读权限请求,对话框仍然挂在应用程序“后面”。告诉我在处理权限请求对话框后如何转换到另一个活动?或者如何将请求对话框带到前台。这是活动代码:

public class WelcomeActivity extends AppCompatActivity {

    private ArrayList<String> urlsFromServer = new ArrayList<>();
    private ArrayList<Uri> filesPath = new ArrayList<>();
    private boolean CheckFileStorage = false;
    private final int MY_PERMISSIONS_REQUEST_CODE = 1;

    private String fileNamePath = "filesPath.json";

    private String urlServerJson = "http://*****.ru/todbook/booklist.json";

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        new ParseJsonServer().execute();
    }

    private class ParseJsonServer extends AsyncTask<Void, Void, String> {

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        String resultJsonServer = "";

        @Override
        protected String doInBackground(Void... params) {

            // получаем данные с внешнего ресурса

            try {
                URL url = new URL(urlServerJson);

                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();

                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }

                resultJsonServer = buffer.toString();

            } catch (Exception e) {
                e.printStackTrace();
            }

            return resultJsonServer;

        }

        @Override
        protected void onPostExecute(String strJson) {


            if (resultJsonServer != "") {
                urlsFromServer = GetListUrlCovers(resultJsonServer);

            } else {
                CheckListFile(fileNamePath);
                if (!CheckFileStorage) {
                    Toast toast = Toast.makeText(getApplicationContext(),
                            getString(R.string.NoInternetText), Toast.LENGTH_LONG);
                    toast.show();
                    NextActivity();

                } else {
                    NextActivity();
                }
            }

            CheckListFile(fileNamePath);

            if (CheckFileStorage) {

                String jsResult = MyJSON.getData(getApplicationContext(), fileNamePath);
                filesPath = getFilesPathFromFile(jsResult);

            } else {

                filesPath = new ArrayList<>();

                for (int i = 0; i < urlsFromServer.size(); i++) {
                    int d = i + 1;
                    String fileUrl = urlsFromServer.get(i);
                    String filenam = getApplicationContext().getFilesDir() + File.separator + "bookcover_" + d + ".jpg";
                    FileLoader(fileUrl, filenam);
                }
                String strJs = new Gson().toJson(filesPath);

                if (!checkPermissions()) {
//                    Toast.makeText(WelcomeActivity.this, "Разрешения уже получены", Toast.LENGTH_SHORT).show();
                    setPermissions();
                }

                MyJSON.saveData(getApplicationContext(), strJs, fileNamePath);
            }

            if (filesPath.size() == urlsFromServer.size()) {

                NextActivity();

            } else {
                try {
                    deleteFile(fileNamePath);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                for (int i = 0; i < urlsFromServer.size(); i++) {
                    int d = i + 1;
                    String fileUrl = urlsFromServer.get(i);
                    String filenam = getApplicationContext().getFilesDir() + File.separator + "bookcover_" + d + ".jpg";
                    FileLoader(fileUrl, filenam);
                }
                String strJs = new Gson().toJson(filesPath);

                if (!checkPermissions()) {
                    setPermissions();
//                    Toast.makeText(WelcomeActivity.this, "Разрешения уже получены", Toast.LENGTH_SHORT).show();
                }
/*
                else {
                    setPermissions();
                }
*/

                MyJSON.saveData(getApplicationContext(), strJs, fileNamePath);
                NextActivity();
            }
        }

    }

    private ArrayList<String> GetListUrlCovers(String strJson) {

        JSONObject dataJsonObj;

        try {
            dataJsonObj = new JSONObject(strJson);
            JSONArray books = dataJsonObj.getJSONArray("books");

            for (int i = 0; i < books.length(); i++) {
                JSONObject book = books.getJSONObject(i);
                String url_book = book.getString("coverUrl");
                urlsFromServer.add(url_book);// пишу урлы в ArrayList
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return urlsFromServer;
    }

    private void CheckListFile(String fileNameStorage) {
        File fileUrls = new File(getApplicationContext().getFilesDir().getPath() + "/" + fileNameStorage);

        if (fileUrls.exists()) {

            CheckFileStorage = true;

        }

    }

    private void FileLoader(String fileUrl, String filename) {

        if (!checkPermissions()) {
            setPermissions();
//            Toast.makeText(WelcomeActivity.this, "Разрешения уже получены", Toast.LENGTH_SHORT).show();
        }
/*
        else {
            setPermissions();
        }
*/

        ThinDownloadManager downloadManager = new ThinDownloadManager(5); //количество потоков загрузки
        Uri downloadUri = Uri.parse(fileUrl);
        Uri destinationUri = Uri.parse(filename);
        DownloadRequest downloadRequest = new DownloadRequest(downloadUri).setDestinationURI(destinationUri);
        downloadManager.add(downloadRequest);
        filesPath.add(destinationUri);
    }

    private ArrayList<Uri> getFilesPathFromFile(String jsResult) {
        ArrayList<Uri> urisImg = new ArrayList<>();
        try {
            JSONArray rootJson = new JSONArray(new JSONTokener(jsResult));
            for (int i = 0; i < rootJson.length(); i++) {
                JSONObject o = rootJson.getJSONObject(i);
                String strTo = (String) o.get("uriString");
                urisImg.add(Uri.parse(strTo));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return urisImg;
    }

    private void NextActivity() {

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 2000);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode != MY_PERMISSIONS_REQUEST_CODE) {
            return;
        }
        boolean isGranted = true;
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                isGranted = false;
                break;
            }
        }

        if (isGranted) {
            Toast.makeText(WelcomeActivity.this, "Разрешения получены", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "В разрешениях отказано", Toast.LENGTH_LONG).show();

        }
    }

    private boolean checkPermissions() {
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
        return true;
    }

    private void setPermissions() {
        ActivityCompat.requestPermissions(this, new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE);
    }

}
android
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Turalllb
    2020-12-20T02:49:18Z2020-12-20T02:49:18Z

    WelcomeActivity在 课堂上onCreate 写

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

    如果您使用支持库 - AppCompatActivity 并使用它,则无需检查 api。也可以不检查是否已经有权限,即 checkSelfPermission 方法可以省略。请求许可,如果之前已经获得过,不会有什么不好的事情发生。

    接下来,在 WelcomeActivity 类中,添加这个方法

           @Override
            public  void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
                switch (requestCode) {
                    case MY_PERMISSIONS_REQUEST_CODE: {
                        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            new ParseJsonServer().execute();
                        }
                       else {  Toast.makeText(WelcomeActivity.this, "Без данного разрешения приложение не сможет хранить полученные данные и не будет работать, пожалуйста дайте разрешение", Toast.LENGTH_SHORT).show(); 
    ActivityCompat.requestPermissions(this, new String[]{
                        Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE);
    
                      } 
                    }
                }
            }
    

    失败时调用的 Toast 会很快消失(他们将没有时间阅读它),因为。随后是第二次请求许可。所以这个实现不是很漂亮。但是你必须明白,在获得许可后,必须从这里调用所需的代码。

    一般来说,最好阅读文档,即使使用谷歌翻译,那里的一切都非常清楚。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5