2016-05-19 5 views
0

したがって、アンドロイドマニフェストのパーミッションを宣言しましたが、何らかの理由でセキュリティ例外がスローされます。ここでカメラのアクティビティを開始する際のセキュリティ例外

ここでAndroidのマニフェスト

<?xml version="1.0" encoding="utf-8"?> 

<uses-sdk 
    android:minSdkVersion="18" 
    android:targetSdkVersion="23" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:label="Logo" 
     android:name=".MainActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.FLASHLIGHT" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

は、完全な主な活動

package com.fortytwo.section.firstproject; 

public class MainActivity extends Activity { 
public static final String PACKAGE_NAME = "com.fortytwo.section.firstproject"; 
public static final String DATA_PATH = Environment 
     .getExternalStorageDirectory().toString() + "/SimpleAndroidOCR/"; 

// You should have the trained data file in assets folder 
// You can get them at: 
// http://code.google.com/p/tesseract-ocr/downloads/list 
public static final String lang = "eng"; 

private static final String TAG = "MainActvity.java"; 

Button _button; 
// protected ImageView _image; 
protected EditText _field; 
protected String _path; 
protected boolean _taken; 

protected static final String PHOTO_TAKEN = "photo_taken"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    _field = (EditText) findViewById(R.id.field); 
    _button = (Button) findViewById(R.id.btnCamera); 
    _button.setOnClickListener(new ButtonClickHandler()); 

    _path = DATA_PATH + "/ocr.jpg"; 

    String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" }; 

    for (String path : paths) { 
     File dir = new File(path); 
     if (!dir.exists()) { 
      if (!dir.mkdirs()) { 
       Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed"); 
       return; 
      } else { 
       Log.v(TAG, "Created directory " + path + " on sdcard"); 
      } 
     } 

    } 

    // lang.traineddata file with the app (in assets folder) 
    // You can get them at: 
    // http://code.google.com/p/tesseract-ocr/downloads/list 
    // This area needs work and optimization 
    if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) { 
     try { 

      AssetManager assetManager = getAssets(); 
      InputStream in = assetManager.open("tessdata/" + lang + ".traineddata"); 
      //GZIPInputStream gin = new GZIPInputStream(in); 
      OutputStream out = new FileOutputStream(DATA_PATH 
        + "tessdata/" + lang + ".traineddata"); 

      // Transfer bytes from in to out 
      byte[] buf = new byte[1024]; 
      int len; 
      //while ((lenf = gin.read(buff)) > 0) { 
      while ((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      in.close(); 
      //gin.close(); 
      out.close(); 

      Log.v(TAG, "Copied " + lang + " traineddata"); 
     } catch (IOException e) { 
      Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString()); 
     } 
    } 



    // _image = (ImageView) findViewById(R.id.image); 

} 

public class ButtonClickHandler implements View.OnClickListener { 
    public void onClick(View view) { 
     Log.v(TAG, "Starting Camera app"); 
     startCameraActivity(); 
    } 
} 

// Simple android photo capture: 
// http://labs.makemachine.net/2010/03/simple-android-photo-capture/ 

protected void startCameraActivity() { 
    File file = new File(_path); 
    Uri outputFileUri = Uri.fromFile(file); 

    final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

    startActivityForResult(intent, 0); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    Log.i(TAG, "resultCode: " + resultCode); 

    if (resultCode == -1) { 
     onPhotoTaken(); 
    } else { 
     Log.v(TAG, "User cancelled"); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putBoolean(MainActivity.PHOTO_TAKEN, _taken); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    Log.i(TAG, "onRestoreInstanceState()"); 
    if (savedInstanceState.getBoolean(MainActivity.PHOTO_TAKEN)) { 
     onPhotoTaken(); 
    } 
} 

protected void onPhotoTaken() { 
    _taken = true; 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 4; 

    Bitmap bitmap = BitmapFactory.decodeFile(_path, options); 

    try { 
     ExifInterface exif = new ExifInterface(_path); 
     int exifOrientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, 
       ExifInterface.ORIENTATION_NORMAL); 

     Log.v(TAG, "Orient: " + exifOrientation); 

     int rotate = 0; 

     switch (exifOrientation) { 
      case ExifInterface.ORIENTATION_ROTATE_90: 
       rotate = 90; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_180: 
       rotate = 180; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_270: 
       rotate = 270; 
       break; 
     } 

     Log.v(TAG, "Rotation: " + rotate); 

     if (rotate != 0) { 

      // Getting width & height of the given image. 
      int w = bitmap.getWidth(); 
      int h = bitmap.getHeight(); 

      // Setting pre rotate 
      Matrix mtx = new Matrix(); 
      mtx.preRotate(rotate); 

      // Rotating Bitmap 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); 
     } 

     // Convert to ARGB_8888, required by tess 
     bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 

    } catch (IOException e) { 
     Log.e(TAG, "Couldn't correct orientation: " + e.toString()); 
    } 

    // _image.setImageBitmap(bitmap); 

    Log.v(TAG, "Before baseApi"); 

    TessBaseAPI baseApi = new TessBaseAPI(); 
    baseApi.setDebug(true); 
    baseApi.init(DATA_PATH, lang); 
    baseApi.setImage(bitmap); 

    String recognizedText = baseApi.getUTF8Text(); 

    baseApi.end(); 

    // You now have the text in recognizedText var, you can do anything with it. 
    // We will display a stripped out trimmed alpha-numeric version of it (if lang is eng) 
    // so that garbage doesn't make it to the display. 

    Log.v(TAG, "OCRED TEXT: " + recognizedText); 

    if (lang.equalsIgnoreCase("eng")) { 
     recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " "); 
    } 

    recognizedText = recognizedText.trim(); 

    if (recognizedText.length() != 0) { 
     _field.setText(_field.getText().toString().length() == 0 ? recognizedText : _field.getText() + " " + recognizedText); 
     _field.setSelection(_field.getText().toString().length()); 
    } 

    // Cycle done. 
} 

// www.Gaut.am was here 
// Thanks for reading! 
} 

であり、ここでエラーです。

java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.htc.camera/.CameraServiceEntry clip={text/uri-list U:file:///storage/emulated/0/SimpleAndroidOCR/ocr.jpg} (has extras) } from ProcessRecord{c160803 22921:com.fortytwo.section.firstproject/u0a1020} (pid=22921, uid=11020) with revoked permission android.permission.CAMERA 

アンドロイドマニフェストの権限を削除して変更しようとしました。なぜこれをやっているのか分かりません。

+0

あなたがテストしているAndroidのバージョンは何ですか?あなたの 'targetSdkVersion'は何ですか?マニフェストの投稿を検討することもできます。 – CommonsWare

+0

マニフェストが追加されました。ターゲットは23日実行中です。アンドロイド6.0 – MrAnderson1992

+1

http://stackoverflow.com/questions/32635704/android-permission-doesnt-work-even-if-i-have-declared-it – CommonsWare

答えて

0

Androidマニフェストから権限を削除すると、これが機能します。私はこれがなぜこれを可能にするのか不明です。おそらく、Androidのそれ以降のバージョンでは、アクセス許可は不要です。

+0

デバイスカメラを使用しているため、カメラのアクセス権は必要ありません。 CameraまたはCamera2 APIを使用して独自のカメラインターフェイスを実装する場合にのみ必要です。 – Embydextrous

0

この権限をマニフェストに追加するだけです。

<uses-permission android:name="android.media.action.IMAGE_CAPTURE"/> 
関連する問題