2016-07-21 4 views
0

作成したグラフを保存するために、MPAndroidChartライブラリの保存機能を呼び出そうとしています。私は、チャートの罰金を作成することができますが、私は、チャートを保存しようとすると、以下のことが起こります。Androidスタジオでグラフを保存する問題

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

は、あなたはそれだけで1行から言うのは難しいそうでない場合のサンプルコードを提供する必要があります。私が言うことができる唯一のことは、ビットマップの高さまたは幅がゼロであるため、グラフをレンダリングしてからエラーを保存しようとしていることを確認することです。 – Ben

+0

私はこれが問題だと思っていましたが、保存するまでグラフがレンダリングされるまで待つ方法はありますか? – cmackie21

+0

あなたのワークフローを知らずに言うのは難しいです。レンダリングされるまで、保存ボタンを無効にすることがあります。あなたは保存する前にinvalidate()を呼び出すことができます。 – Ben

答えて

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

    } 
} 
関連する問題