2017-12-12 9 views
1

あなたの助けが必要です。私は外付けのmicroSDを持っていないので、写真を撮ってスマートフォンの内部メモリに保存する簡単なアプリを書いています。私は、アプリを実行し、写真を撮るためのボタンをタップすると、クラッシュします。どうすればいいですか?事前にありがとうございます。ここ は、モニターの結果である:撮影中のFileUriExposedException

java.lang.IllegalStateException: Could not execute method for android:onClick 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
                       at android.view.View.performClick(View.java:5647) 
                       at android.view.View$PerformClick.run(View.java:22462) 
                       at android.os.Handler.handleCallback(Handler.java:754) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:163) 
                       at android.app.ActivityThread.main(ActivityThread.java:6205) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
                      Caused by: java.lang.reflect.InvocationTargetException 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                       at android.view.View.performClick(View.java:5647)  
                       at android.view.View$PerformClick.run(View.java:22462)  
                       at android.os.Handler.handleCallback(Handler.java:754)  
                       at android.os.Handler.dispatchMessage(Handler.java:95)  
                       at android.os.Looper.loop(Looper.java:163)  
                       at android.app.ActivityThread.main(ActivityThread.java:6205)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)  
                      Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/AutoFare/Wed%20Dec%2013%2000%3A22%3A01%20GMT%2B04%3A00%202017.png exposed beyond app through ClipData.Item.getUri() 
                       at android.os.StrictMode.onFileUriExposed(StrictMode.java:1796) 
                       at android.net.Uri.checkFileUriExposed(Uri.java:2346) 
                       at android.content.ClipData.prepareToLeaveProcess(ClipData.java:845) 
                       at android.content.Intent.prepareToLeaveProcess(Intent.java:8957) 
                       at android.content.Intent.prepareToLeaveProcess(Intent.java:8942) 
                       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1519) 
                       at android.app.Activity.startActivityForResult(Activity.java:4402) 
                       at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:54) 
                       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) 
                       at android.app.Activity.startActivityForResult(Activity.java:4360) 
                       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:708) 
                       at com.example.emilhikmett.camera.MainActivity.Takepic(MainActivity.java:45) 
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
                       at android.view.View.performClick(View.java:5647)  
                       at android.view.View$PerformClick.run(View.java:22462)  
                       at android.os.Handler.handleCallback(Handler.java:754)  
                       at android.os.Handler.dispatchMessage(Handler.java:95)  
                       at android.os.Looper.loop(Looper.java:163)  
                       at android.app.ActivityThread.main(ActivityThread.java:6205)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)  

MainActivity.java

import android.content.Intent; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import java.io.File; 
import java.util.Date; 

public class MainActivity extends AppCompatActivity { 
private static final int CAMERA_IMAGE_REQUEST = 101; 
private String imageName; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getSupportActionBar().hide(); 
} 

public void Takepic(View view) { 
    // Creating folders for Image 
    Button one = (Button) findViewById(R.id.button16); 
    String imageFolderPath = Environment.getExternalStorageDirectory().toString() 
      + "/AutoFare"; 
    File imagesFolder = new File(imageFolderPath); 
    imagesFolder.mkdirs(); 

    // Generating file name 
    imageName = new Date().toString() + ".png"; 

    // Creating image here 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imageFolderPath, imageName))); 
    startActivityForResult(takePictureIntent, 
      CAMERA_IMAGE_REQUEST); 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
// TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK && requestCode == CAMERA_IMAGE_REQUEST) { 

     Toast.makeText(this, "Success", 
       Toast.LENGTH_SHORT).show(); 
    } 
} 
} 

activity_main.xml

<LinearLayout 
    android:layout_width="368dp" 
    android:layout_height="495dp" 
    tools:layout_editor_absoluteY="8dp" 
    tools:layout_editor_absoluteX="8dp" 
    android:orientation="vertical"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:layout_weight="1" 
     android:paddingLeft="100dp" 
     android:paddingRight="100dp" 
     android:paddingTop="40dp"> 

     <Button 
      android:id="@+id/button16" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="take picture" 
      android:textColor="#FFFFFF" 
      android:textAlignment="textStart" 
      android:layout_marginTop="100dp" 
      android:padding="16dp" 
      android:onClick="Takepic" 
      android:clickable="true" 
      /> 


    </LinearLayout> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:orientation="vertical" 
     android:paddingLeft="50dp" 
     android:paddingRight="50dp" 
     android:paddingBottom="30dp"> 
    </LinearLayout> 



</LinearLayout> 

権限マニフェストファイル内

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); 
StrictMode.setVmPolicy(builder.build()); 

を:

+0

投稿全体ログ...クラッシュ – rafsanahmad007

+0

追加.......... – Marada

答えて

1

を追加してみてください。そのため、VMはファイルURIの公開を無視します。

問題を解決するもう1つの方法は、代わりにFileproviderを作成することです。ここで

Good Read

ベストプラクティスを設定することですですFileProvider(あなたがリンク上でそれを見ることができます)。

StrictModeは、ショートカットで問題を解決するのに似たような方法です。

+0

最初の方法はファイルプロバイダを使用することです。最後は厳密なモードを使いこなすでしょう。悪いアドバイス。 – greenapps

+0

ええ、私はそう思った...私は答えを編集しました..thanks BTW @greenapps – rafsanahmad007

関連する問題