我正在尝试调用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
);
}
}
}
答案 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);
}
}