在Android Studio中保存图表时出现问题

cmackie21

我试图调用MPAndroidChart库的保存功能,以保存我创建的图表。我可以很好地创建图表,但是当我尝试保存图表时,会发生以下情况:

07-21 14:52:42.879 5818-5818/com.example.a1003137m.profitcalculator E/AndroidRuntime: FATAL EXCEPTION: main
   Process: com.example.a1003137m.profitcalculator, PID: 5818
   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.a1003137m.profitcalculator/com.example.a1003137m.profitcalculator.ChartActivity}: java.lang.IllegalArgumentException: width and height must be > 0
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
       at android.app.ActivityThread.-wrap11(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5443)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    Caused by: java.lang.IllegalArgumentException: width and height must be > 0
       at android.graphics.Bitmap.createBitmap(Bitmap.java:855)
       at android.graphics.Bitmap.createBitmap(Bitmap.java:834)
       at android.graphics.Bitmap.createBitmap(Bitmap.java:801)
       at com.github.mikephil.charting.charts.Chart.getChartBitmap(Chart.java:1492)
       at com.github.mikephil.charting.charts.Chart.saveToGallery(Chart.java:1597)
       at com.github.mikephil.charting.charts.Chart.saveToGallery(Chart.java:1636)
       at com.example.a1003137m.profitcalculator.ChartActivity.onCreate(ChartActivity.java:55)
       at android.app.Activity.performCreate(Activity.java:6245)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5443) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

我可以看到问题出在非法参数异常上,但是有人会偶然知道为什么会抛出该异常吗?

我的清单中有这些权限,并且在运行时也要求它们。

这是发生上述堆栈跟踪的问题所在的行:

mChart.saveToGallery("chart",50);

活动代码:

package com.example.a1003137m.profitcalculator;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.RelativeLayout;

import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.formatter.XAxisValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ChartActivity extends AppCompatActivity {


    protected BarChart mChart;
    private String choice;
    // Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chart);
        Intent intent = getIntent();
        choice = intent.getStringExtra("choice");
        Bundle data_bundle = intent.getBundleExtra("bundle");
        verifyStoragePermissions(this);
        boolean check = setChart(data_bundle);
        if (check){
            mChart.saveToGallery("chart",50);
        }
    }



    private boolean setChart(Bundle data_bundle) {

        mChart = (BarChart) findViewById(R.id.chart);
        mChart.setDescription("Test");
        ArrayList<String> year = (ArrayList<String>) data_bundle.getSerializable("year");
        ArrayList<Double> depreciation = (ArrayList<Double>) data_bundle.getSerializable("dep");
        ArrayList<Integer> population = (ArrayList<Integer>) data_bundle.getSerializable("pop");


        ArrayList<BarEntry> dep_entries = new ArrayList<>();
        ArrayList<BarEntry> pop_entries = new ArrayList<>();
        for (int i = 0; i< depreciation.size(); i++){
            BarEntry entry = new BarEntry(depreciation.get(i).floatValue(),i);
            dep_entries.add(entry);
        }
        for (int i = 0; i< population.size(); i++){
            BarEntry entry = new BarEntry(population.get(i).floatValue(), i);
            pop_entries.add(entry);
        }

        BarDataSet barDep = new BarDataSet(pop_entries,"Population");
        barDep.setColors(ColorTemplate.COLORFUL_COLORS);
        BarDataSet barPop = new BarDataSet(dep_entries, "Depreciation");
        barDep.setColors(ColorTemplate.JOYFUL_COLORS);

        List<IBarDataSet> sets = new ArrayList<>();
        sets.add(barDep);
        sets.add(barPop);

        mChart.setDescription("Bar Chart of data for "+choice);
        BarData bar_data = new BarData(year, sets);
        mChart.setData(bar_data);
        boolean success =true;
        return success;


    }

    /**
     * Checks if the app has permission to write to device storage
     *
     * If the app does not has permission then the user will be prompted to grant permissions
     *
     * @param activity
     */
    public static void verifyStoragePermissions(Activity activity) {
        // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }




}
cmackie21

我通过在布局中添加一个按钮来解决问题,该按钮在单击时可以保存图形。这样可以确保在尝试将图形保存到设备之前完全渲染并附加了图形。

完整代码:

package com.example.a1003137m.profitcalculator;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;

import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.formatter.XAxisValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ChartActivity extends AppCompatActivity {


    protected BarChart mChart;
    private String choice;
    // Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chart);
        Intent intent = getIntent();
        choice = intent.getStringExtra("choice");
        Bundle data_bundle = intent.getBundleExtra("bundle");
        verifyStoragePermissions(this);
        mChart = (BarChart) findViewById(R.id.chart);
        setChart(data_bundle);
    }




    private void setChart(Bundle data_bundle) {


        ArrayList<String> year = (ArrayList<String>) data_bundle.getSerializable("year");
        ArrayList<Double> depreciation = (ArrayList<Double>) data_bundle.getSerializable("dep");
        ArrayList<Integer> population = (ArrayList<Integer>) data_bundle.getSerializable("pop");


        ArrayList<BarEntry> dep_entries = new ArrayList<>();
        ArrayList<BarEntry> pop_entries = new ArrayList<>();
        for (int i = 0; i< depreciation.size(); i++){
            BarEntry entry = new BarEntry(depreciation.get(i).floatValue(),i);
            dep_entries.add(entry);
        }
        for (int i = 0; i< population.size(); i++){
            BarEntry entry = new BarEntry(population.get(i).floatValue(), i);
            pop_entries.add(entry);
        }

        BarDataSet barDep = new BarDataSet(pop_entries,"Population");
        barDep.setColors(ColorTemplate.COLORFUL_COLORS);
        BarDataSet barPop = new BarDataSet(dep_entries, "Depreciation");
        barDep.setColors(ColorTemplate.JOYFUL_COLORS);

        List<IBarDataSet> sets = new ArrayList<>();
        sets.add(barDep);
        sets.add(barPop);

        mChart.setDescription("Bar Chart of data for "+choice);
        BarData bar_data = new BarData(year, sets);
        mChart.setData(bar_data);



    }

    /**
     * Checks if the app has permission to write to device storage
     *
     * If the app does not has permission then the user will be prompted to grant permissions
     *
     * @param activity
     */
    public static void verifyStoragePermissions(Activity activity) {
        // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }


    public void saveChart(View view) {

        BarChart saveChart = (BarChart) findViewById(R.id.chart);
        saveChart.saveToGallery("chart",50);

    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android中保存文件时出现问题

来自分类Dev

在Android Studio中添加外部库时出现问题

来自分类Dev

Android Studio切换主题时出现问题

来自分类Dev

更新后,Android Studio出现问题

来自分类Dev

替换android片段时出现问题

来自分类Dev

Android:创建目录时出现问题

来自分类Dev

在Android Studio中(在Mac上)启动AVD(Android虚拟设备)时出现问题

来自分类Dev

Android:保存加密的用户名/密码时出现问题

来自分类Dev

在Android Studio中从Firebase数据库检索图像时出现问题

来自分类Dev

运行Android Studio模拟器时出现问题:git设置启动并尝试降级

来自分类Dev

在Android Studio中启动模拟器时出现问题。

来自分类Dev

Android Studio:在非活动类中访问子项时出现问题

来自分类Dev

更新Android Studio后Android Gradle出现问题

来自分类Dev

Visual Studio 2015和Xamarin出现问题(Android开发)

来自分类Dev

在添加Android对话框时出现问题

来自分类Dev

在Android上检查文件时出现问题

来自分类Dev

使用资源导入android支持库时出现问题

来自分类Dev

移动/复制捕获的图像phonegap android时出现问题

来自分类Dev

Android应用中旋转图像时出现问题

来自分类Dev

从Air Native Extension(android)显示ImageView时出现问题

来自分类Dev

将参数从android传递到php时出现问题

来自分类Dev

Android / Kotlin:使用URLConnection发送数据时出现问题

来自分类Dev

在Android中获取参数值时出现问题

来自分类Dev

在Android中加载Google Map时出现问题

来自分类Dev

解析程序包时出现问题,android吗?

来自分类Dev

在Android中使用asynctask调用函数时出现问题

来自分类Dev

Android:创建文件时出现问题

来自分类Dev

Gradle / Android SDK导入克隆项目时出现问题

来自分类Dev

运行android模拟器时出现问题

Related 相关文章

  1. 1

    在Android中保存文件时出现问题

  2. 2

    在Android Studio中添加外部库时出现问题

  3. 3

    Android Studio切换主题时出现问题

  4. 4

    更新后,Android Studio出现问题

  5. 5

    替换android片段时出现问题

  6. 6

    Android:创建目录时出现问题

  7. 7

    在Android Studio中(在Mac上)启动AVD(Android虚拟设备)时出现问题

  8. 8

    Android:保存加密的用户名/密码时出现问题

  9. 9

    在Android Studio中从Firebase数据库检索图像时出现问题

  10. 10

    运行Android Studio模拟器时出现问题:git设置启动并尝试降级

  11. 11

    在Android Studio中启动模拟器时出现问题。

  12. 12

    Android Studio:在非活动类中访问子项时出现问题

  13. 13

    更新Android Studio后Android Gradle出现问题

  14. 14

    Visual Studio 2015和Xamarin出现问题(Android开发)

  15. 15

    在添加Android对话框时出现问题

  16. 16

    在Android上检查文件时出现问题

  17. 17

    使用资源导入android支持库时出现问题

  18. 18

    移动/复制捕获的图像phonegap android时出现问题

  19. 19

    Android应用中旋转图像时出现问题

  20. 20

    从Air Native Extension(android)显示ImageView时出现问题

  21. 21

    将参数从android传递到php时出现问题

  22. 22

    Android / Kotlin:使用URLConnection发送数据时出现问题

  23. 23

    在Android中获取参数值时出现问题

  24. 24

    在Android中加载Google Map时出现问题

  25. 25

    解析程序包时出现问题,android吗?

  26. 26

    在Android中使用asynctask调用函数时出现问题

  27. 27

    Android:创建文件时出现问题

  28. 28

    Gradle / Android SDK导入克隆项目时出现问题

  29. 29

    运行android模拟器时出现问题

热门标签

归档