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

时间:2016-07-21 14:02:30

标签: android mpandroidchart

我正在尝试调用MPAndroidChart库的save函数以保存我创建的图表。我可以创建图表,但是当我尝试保存图表时,会发生以下情况:

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
            );
        }
    }




}

1 个答案:

答案 0 :(得分:0)

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

完整代码:

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);

    }
}